修改后的dict类的实例应该返回其中一个值

时间:2015-02-27 02:01:52

标签: python

我想知道是否可以创建具有以下属性的Python类:

  1. 它应具有列表或字典的所有属性,即从其中一个继承
  2. 调用实例时,它将返回由index或key
  3. 预定义的元素

    例如:

    class A(dict):
        def __init__(self, name):
            self.name = name
            self['a'] = 1
            self['b'] = 2
    
    a = A('a')
    

    当调用实例a时,它将返回1所定义的'a'。通过密钥的原始访问仍然可用。

    问题X:

    我有一个继承自Fruits的课程dict。在self中,它可以有多个类Fruit的实例,但通常只有一个实例。因此,当我使用Fruits的实例时,我想使用该单个实例的方法和属性,就像它们是A的属性和方法一样:

    class Fruit(object):
        def __init__(self):
            self.name = 'apple'
    
    class Fruits(dict):
        def __init__(self, name):
            self.fruit_name = name
            self['apple'] = Fruit()
    
    a = Fruits('apple')
    

    我希望a.name返回'apple'。我有@property的解决方案:

    class Fruits(dict):
        def __init__(self, name):
            self.fruit_name = name
            self['apple'] = Fruit()
        @property
        def name(self):
            return self[self.fruit_name].name
    

    但我正在寻找更好的东西......

1 个答案:

答案 0 :(得分:0)

不确定我是否完全按照您的问题,但您无法直接调用实例;你可以在实例中调用一个函数。现在,由于adict的实例,因此您可以访问其密钥 -

In [9]: a['a']
Out[9]: 1

或者,

In [10]: a[a.name]
Out[10]: 1

您可以在__call__

中实施A方法
class A(dict):
    def __init__(self, name):
        self.name = name
        self['a'] = 1
        self['b'] = 2

    def __call__(self):
        return self[self.name]

然后,

In [24]: a = A('a')

In [25]: a()
Out[25]: 1

这是否与你正在寻找的一致?