2016-09-07 3 views
4

クラスのインスタンス化中に__getattr__を変更したいと思います。たとえば:インスタンス化時に__getattr__を変更する

class AttrTest(object): 
    def __init__(self): 
     self.__getattr__ = self._getattr 

    def _getattr(self, attr): 
     print("Getting {}".format(attr)) 

私はこれのように振る舞うと予想しているでしょう:

class AttrTest(object): 
    def __getattr__(self, attr): 
     print("Getting {}".format(attr)) 

しかし、それはしていません。私は実行たとえば

、:

>>> at = AttrTest() 
>>> at.test 

私は両方のクラスがGetting testを印刷することを期待するが、トップクラスはAttributeErrorをスローします。

__getattr__このように変更することはできませんか?

+0

私が持っている回答の質問は、当然、「なぜですか? –

+0

@WayneWernerまあ、別のタイプのシリアライゼーション(json、pickle)を使用する '__getattr__'という2つの実装があり、私のクラスではインスタンス化時にkwargに基づいてクラスを選択できるようにしたいと考えていました。 – ballsatballsdotballs

+0

なぜサブクラスはありませんか?おそらく、発信者は、彼らがkwargを設定しているのでどちらがどちらであるかを知っているでしょう –

答えて

3

__getattr__のような特別な方法の場合、Pythonは__dict__というベースで、__dict__ではなく、ベースを検索します。

詳細については、データモデルのドキュメントのspecial lookupセクションを参照してください。

私は、それぞれが直列化の異なる タイプ(JSON、漬物)を使用__getattr__の2つの実装を持っている、と私は私のクラスはkwargに基づいていずれかを選択する できるようにしたかったです。

これは、__getattr__を上書きするのには適していません。このアイデアを放棄し、@propertyまたはdescriptorsを使用して、シリアル化を動的に処理することを検討してください。

+1

TIL ...これ! :) –

+0

@ballsatballsdotballs - あなたは '_getattr__'を呼び出すことができます' _getattr'は '_getattrjson'または' _getattrpickle'に初期化引数に基づいて設定されていますか? – mgilson

+0

@mgilsonそれはうまくいく、はい。 – ballsatballsdotballs

関連する問題