带有类的Python自引用字典

时间:2013-04-13 14:01:14

标签: python

我正在尝试将参数列表作为类中的字典。 由于数据的性质,一些参数来自其他参数,但经常使用,我宁愿将它们的推导保留在参数字典中。 我已经设法组建了一个自我引用的字典,当我可以直接命名字典时可以正常工作,但因为它是一个类的一部分,并且可能在许多不同的文件中实现,我很难让它能够自称。

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中获取'self'不幸的是,定义。 有什么建议吗?

1 个答案:

答案 0 :(得分:3)

self不只是神奇地出现;当通过实例(通过invoking the function as a descriptor)访问时,Python函数被包装在方法中,然后self作为第一个参数传递给函数。

对于你的lambdas,你需要在中明确地传递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']
    })