これはSETATTRが呼び出されたときに、無限再帰ループが発生し、:__setattr__とプロパティ設定ツールで再帰的ループを回避する方法は?セッターを持つプロパティですsome_propの値を設定しようとしたとき
class TypeSystem(object):
def __setattr__(self, key, value):
if the_special_case is True:
# do something
else:
super(TypeSystem,self).__setattr__(key,value)
class Entity(TypeSystem):
@property
def some_prop(self):
some_prop = self.data.get('some_prop')
if some_prop is None and hasattr(self,"some_prop"):
some_prop = self.some_prop
return some_prop
@some_prop.setter
def some_prop(self,value):
self.some_prop = value
>>> entity = Entity()
>>> entity.some_prop = 3
これは、プロパティとして定義されていない通常の属性については正常に動作しますSuperはオブジェクトのsetattrを呼び出して再帰ループを防止するためです。
some_propはあらかじめ定義されていないので、setattrがsome_propのセッターの代わりに呼び出されるように見えるので、ループに入ります。私もこれを試してみました
....
@some_prop.setter
def some_prop(self, value):
super(TypeSystem, self).__setattr__("some_prop", value)
しかし、それはまだ再帰ループに入ります。私はそれを避ける方法を見ていない。