继承自dict的类的术语

时间:2015-07-26 16:46:13

标签: python

在这种情况下,如果 是一个dict,那么它是否合适? "是"看起来不太对劲。 f 以两种不同的方式拥有 dict吗?描述和思考这个问题的正确术语是什么?

class Foo(dict):
    def __init__(self):
        self.name = "John"
        self["number"] = 42

f = Foo()

f.__dict__
>>> {'name': 'John'}          [A]
f.items()
>>> [('number', 42)]          [B]
f 
>>> {'number': 42}            [C]

编辑:我对我们描述这些词典的方式很感兴趣。有什么合适的术语来讨论这个问题?

3 个答案:

答案 0 :(得分:2)

从实施的角度来看,是的,f dict而 dict。您已充分证明__dict__f本身都是单独的词典。

但是,我认为考虑它的实际方法是f 具有 属性(通过__dict__)但它也是 一个dict(通过子类化)。你真的不应该直接访问__dict__;它是Python类的实现细节。

当然,Python是Python,没有理由隐藏程序员的内部细节。 “我们都同意成年人”,就像Pythonism一样。

答案 1 :(得分:1)

这更像是与语言无关的语句,但是定义的类之间存在两种关系:

  • has-a ,用于描述构图(如mixins或属性)和
  • is-a ,如果某个类是另一个类的子类型,则使用该文件。

您的班级Foo dict,因为它继承自dict。并不是它有一个dict,因为没有单独的属性是字典,如果用作一个{a-la duck typing,它也会表现得像dict。< / p>

答案 2 :(得分:0)

看那个:

class Foo(dict):
    def __init__(self):
        self.name = "John"
        self.number = 42
        self.num = 4


>>> f = Foo()
>>> f.__dict__
{'name': 'John', 'number': 42, 'num': 4}
>>> 

obj.__dict__包含所有变量。

>>> class cl:
    def __init__(self):
        self.val = 12


>>> f = cl()
>>> f.__dict__
{'val': 12}