2011-09-17 6 views
2

これは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) 

しかし、それはまだ再帰ループに入ります。私はそれを避ける方法を見ていない。

答えて

10

__setattr__またはTypeSystemとは関係ありません。あなたの問題は

@some_prop.setter 
def some_prop(self,value): 
    self.some_prop = value 

です。これは明らかに無限ループです。プロパティの設定ツールでプロパティを設定しようとしています。

あなたがゲッターで同じ問題があります。

some_prop = self.some_prop 

も同様に無限ループが発生します - あなたは、プロパティのゲッターにプロパティを取得しようとしています。

あなたは、実際のデータを保持するために別の変数を使用する必要があります。

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 
関連する問題