В классе Python, когда я использую __setattr__, он имеет приоритет над свойствами, определенными в этом классе (или любыми базовыми классами). Рассмотрим следующий код:
class Test(object):
def get_x(self):
x = self._x
print "getting x: %s" % x
return x
def set_x(self, val):
print "setting x: %s" % val
self._x = val
x = property(get_x, set_x)
def __getattr__(self, a):
print "getting attr %s" % a
return -1
def __setattr__(self, a, v):
print "setting attr %s" % a
Когда я создаю класс и пытаюсь установить x, вместо set_x вызывается __setattr__:
>>> test = Test()
>>> test.x = 2
setting attr x
>>> print test.x
getting attr x_
getting x: -1
-1
Я хочу добиться того, что фактический код в __setattr__ был вызван только в том случае, если нет соответствующего свойства, т.е. test.x = 2 должен вызывать set_x. Я знаю, что я могу легко добиться этого, вручную проверив, является ли a "x" __setattr__, однако это создало бы плохой дизайн. Есть ли более умный способ обеспечить правильное поведение в __setattr__ для каждого свойства, определенного в классе и всех базовых классах?