Pythonルックアップをどうやって絞るのですか:make.up.a.dot.separated.name.and.use.it.until.destroyed = 777
-
05-07-2019 - |
質問
私はPythonの初心者であり、Pythonのドット名検索プロセスを試す非常に特定の悩みがあります。 " make.py"でクラスまたは関数をコーディングするにはどうすればよいですか?これらの割り当てステートメントが正常に機能するように
import make
make.a.dot.separated.name = 666
make.something.else.up = 123
make.anything.i.want = 777
解決
#!/usr/bin/env python
class Make:
def __getattr__(self, name):
self.__dict__[name] = Make()
return self.__dict__[name]
make = Make()
make.a.dot.separated.name = 666
make.anything.i.want = 777
print make.a.dot.separated.name
print make.anything.i.want
特別な __ getattr __
メソッドは、名前付きの値が見つからないときに呼び出されます。行 make.anything.i.want
は、次と同等の処理を行います:
m1 = make.anything # calls make.__getattr__("anything")
m2 = m1.i # calls m1.__getattr__("i")
m2.want = 777
上記の実装では、これらの __ getattr __
の呼び出しを使用して、不明なプロパティにアクセスするたびに Make
オブジェクトのチェーンを作成します。これにより、実際の値が割り当てられる最終割り当てまで、ドットアクセスを任意の深さにネストできます。
Pythonドキュメント-属性アクセスのカスタマイズ:
object .__ getattr __(self、name)
属性の検索で通常の場所で属性が見つからなかった場合に呼び出されます(つまり、インスタンス属性ではなく、
self
のクラスツリーでも見つかりません)。name
は属性名です。このメソッドは、(計算された)属性値を返すか、AttributeError
例外を発生させる必要があります。通常のメカニズムで属性が見つかった場合、
__ getattr __()
は呼び出されないことに注意してください。 (これは、__ getattr __()
と__ setattr __()
の間の意図的な非対称です。)これは、効率上の理由と__ getattr __()
インスタンスの他の属性にアクセスする方法はありません。少なくともインスタンス変数については、インスタンス属性ディクショナリに値を挿入せずに(代わりに別のオブジェクトに値を挿入することで)完全な制御を偽造できることに注意してください。新しいスタイルのクラスで実際に完全な制御を取得する方法については、以下の__ getattribute __()
メソッドを参照してください。
object .__ setattr __(self、name、value)
属性の割り当てが試行されたときに呼び出されます。これは、通常のメカニズムの代わりに呼び出されます(つまり、値をインスタンスディクショナリに格納します)。
name
は属性名、value
はそれに割り当てられる値です。
__ setattr __()
がインスタンス属性に割り当てたい場合、単にself.name = value
—を実行するべきではありません。これにより、それ自体への再帰呼び出しが発生します。代わりに、インスタンス属性の辞書に値を挿入する必要があります(例:self .__ dict __ [name] = value
)。新しいスタイルのクラスの場合、インスタンスディクショナリにアクセスするのではなく、同じ名前(たとえば、object .__ setattr __(self、name、value)
)で基本クラスメソッドを呼び出す必要があります。