伪词作为属性

时间:2010-08-26 06:26:37

标签: python methods nested nested-class nested-attributes

我有一个Python类C,它应该有两个伪 - dict s ab。术语伪dicts意味着字典实际上并不存在,并且每次访问密钥时它们都会被“重新计算”。

在伪代码中,这看起来像这样:

class C:
    def a.__getitem__(self, key):
        return 'a'
    def b.__getitem__(self, key):
        return 'b'

>>> c = C()
>>> c.a['foo']
'a'
>>> c.b['bar']
'b'

我可以为ab实现一个类,但由于两者都只有一些简短的方法,我想知道是否有更优雅和紧凑的方法来实现这一点。

2 个答案:

答案 0 :(得分:1)

为什么不定义自己的类?

class PseudoDict(object):
    def __init__(self, c):
        self.c = c

    def __getitem__(self, key):
        return self.c.somethingmagical()

class C(object):
    def __init__(self):
        self.a = PseudoDict(self)
        self.b = PseudoDict(self)

c = C()
print c.a['foo']
print c.b['bar']

我不确定这些“伪词典”的值来自何处,因此您必须更新__getitem__方法。

答案 1 :(得分:1)

喜欢这个吗?

from collections import defaultdict
class C:
    a = defaultdict(lambda:'a')
    b = defaultdict(lambda:'b')

c=C()
print c.a['foo']
print c.b['bar']

或者对于真正的计算函数可能是这样吗?

from collections import defaultdict

class C:
    def __init__(self):
        self.a = defaultdict(self.geta)
        self.b = defaultdict(self.getb)
    def geta(self):
        return 'a'
    def getb(self):
        return 'b'

c=C()
print c.a['foo']
print c.b['bar']