__setattr__
, если он существует, вызывается для каждого атрибута, установленного на объекте.
Ваш пример кода, однако, довольно запутанный для меня. Что вы пытаетесь сделать с заявлением: setattr(super(Clazz, self), name, value)
??
Установить атрибут self, с самооценкой как экземпляр его суперкласса? Это не имеет никакого смысла, потому что объект все еще «я».
С другой стороны, попытка использовать «setattr» для объекта, возвращаемого вызовом «super», всегда будет давать ошибку атрибута, независимо от того, существует ли атрибут на суперклассе или нет. Это связано с тем, что супер возвращает не сам суперкласс, а объект-оболочку, который имеет атрибуты fetch, когда они нужны, поэтому вы можете использовать «hasattr» в объекте, возвращаемом супер, но не setattr. Я думал, что это будет вести себя так, а просто попытался его на консоли:
>>> class A(object):pass
...
>>> class B(A): pass
...
>>> b = B()
>>> super(B,b)
<super: <class 'B'>, <B object>>
>>> setattr(super(B,b), "a", 5)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'super' object has no attribute 'a'
>>> A.a = 1
>>> setattr(super(B,b), "a", 5)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'super' object has no attribute 'a'
Но тогда, вы можете просто использовать «hasattr» в самом объекте, и действуйте следующим образом:
def __setattr__(self, attr, value):
if hasattr(self, value):
#this works because retrieving "__setattr__" from the
# result of the supercall gives the correct "__setattr__" of the superclass.
super(Clazz, self).__setattr__(self, attr, value)
else:
# transform value /or attribute as desired in your code
super(Clazz, self).__setattr__(self, attr, value)
Ну, вы можете использовать 'if hasattr()' ... – kindall
Ну, документация довольно подробно об этом ... что еще спросить? – delnan
Вы можете сделать декоратор, чтобы сделать это за вас – jterrace