Аргументы, передаваемые setCustAttr
именно те аргументы, вы передаете в setattr
.
def setCustAttr(self, name, value):
setattr(self, name, value)
Почему вы хотите обертку вокруг setattr
? Вы можете попробовать выполнить некоторые проверки:
def setCustAttr(self, name, value):
if name not in ['bar', 'baz']:
raise ValueError("Custom attribute must be 'bar' or 'baz'")
if name == 'bar' and value < 0:
raise ValueError("'bar' attribute must be non-negative")
if name == 'baz' and value % 2:
raise ValueError("'baz' attribute must be even")
setattr(self, name, value)
Однако это не мешает пользователю вашего класса от игнорирования вашего метода setCustAttr
и назначения непосредственно к объекту:
g = MyClass()
g.bar = -5 # Negative bar!
g.baz = 3 # Odd baz!
g.quux = 2 # Non-bar/baz attribute!
Python имеет глубокую магию для обеспечения большего контроля над тем, как атрибуты установлены на объекте (см. __slots__
, __{get,set}attr__
, __getattribute__
, свойства и т. д.), но в целом они не используются только для предотвращения приведенных выше примеров. Путь Python заключается в том, чтобы просто документировать, как должен использоваться экземпляр вашего класса, и доверять пользователю соблюдать ваши инструкции. (И если они этого не делают, caveat emptor.)
Возможный дубликат [python создать объект и добавить к нему атрибуты] (http://stackoverflow.com/questions/2827623/python-create-object-and -add-attributes-to-it) – felipsmartins
Не обманывать этот вопрос. Этот вопрос касается 'setattr', который не работает на' object'. Скорее всего, это что-то другое. – user2357112
Я предполагаю, что вы имеете в виду в дополнение к 'g.var = 5'? – chepner