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']

因为我不知道从哪里调用 lambda 函数我不知道如何给它一个字典的引用,不幸的是,它似乎没有从getitem定义中提取“自我”。有什么建议么?

4

1 回答 1

4

self不只是神奇地出现;Python 函数在通过实例访问时(通过将函数作为描述符调用)被包装在方法中,self然后作为第一个参数传递给函数。

self对于您的 lambda ,您需要显式传入:

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 回答