2017-02-10 4 views
0

私が目指しているのは、python3のオブジェクトを属性アクセスに関して通常どおりに動作させることです。ただし、通常のルックアップで属性が利用できない場合他の方法で値をフェッチ/計算する必要があります。オブジェクトにデフォルト値を持ついい(r)方法はありますか?

は、私は1つ__getattr__メソッドを定義することによって、問題を解決できることを知っている:

def __getattr__(self, key): 
    if key == 'foo': 
     return calculate_default_foo() 
    elif key == 'bar': 
     return getattr(dfltobj, 'bar') 
    elif key == 'frob': 
     return 42 
    raise AttributeError 

が、それは私がのpython3でこれを行うために、よりエレガントな方法があるかどうだろpython2そう感じています。 propertyを定義するだけでは、その属性へのアクセスが完全にオーバーライドされるため、うまく機能しませんが、そうでなければ機能していれば良いアプローチになります。

答えて

0

私はそれを回避する方法はないと思うが、__getattr__を変更する素敵な(R)方法があります:

def __getattr__(self, item): 
    if item == "foo" and not self.foo: 
     return calculate_default() 
    return self.__getattribute__(foo) 

は、それは私はあなたが質問aを誤解だと思う:)

+0

を助けたホープビット。その意図は、 'foo.attr2'がデフォルト値を出すべきであるということです(それは、その場で計算する必要があります)。 – skyking

+0

私の悪い!私は今それを得たと思う。 – mikelsr

関連する問題