2

クラス内の辞書としてパラメーターのリストを作成しようとしています。データの性質上、一部のパラメーターは他のパラメーターから派生していますが、頻繁に使用されるため、派生をパラメーター ディクショナリ内に保持することをお勧めします。辞書に直接名前を付けることができる場合は正常に機能する自己参照辞書をまとめることができましたが、それはクラスの一部であり、多くの異なるファイルに実装される可能性があるため、それを実現するのに苦労しています自分自身に名前を付ける。

class foo:
    class ParamDict(dict):
        def __getitem__(self, key):
            val = dict.__getitem__(self, key)
            return callable(val) and val() or val

    params = ParamDict({
        'a': 5,
        'b': lambda: 2**self['a']
        })

if __name__ == '__main__':
    X = foo()
    Y = foo()
    Y.params['a'] = 3

    print X.params['a'], X.params['b']
    print Y.params['a'], Y.params['b']

ラムダ関数がどこから呼び出されるかわからないため、辞書への参照を与える方法がわからないため、残念ながらgetitem定義から「自己」を取得していないようです。助言がありますか?

4

1 に答える 1

4

self魔法のように現れるだけではありません。Python 関数は、インスタンスを介して (関数を記述子として呼び出して)アクセスするとメソッドにラップさselfれ、最初の引数として関数に渡されます。

selfラムダについては、明示的に渡す必要があります。

class ParamDict(dict):
    def __getitem__(self, key):
        val = dict.__getitem__(self, key)
        return callable(val) and val(self) or val

params = ParamDict({
    'a': 5,
    'b': lambda self: 2**self['a']
    })
于 2013-04-13T14:33:20.750 に答える