В классе 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__
для каждого свойства, определенного в классе и всех базовых классах?