添加到子类中的父类的class属性

时间:2015-03-13 09:55:18

标签: python inheritance

我可能在这里走错路,所以如果我的方法是假的,请提出建议。

基本上我有一个类,其中包含一个包含每个属性的打印信息的字典。我创建了这个类的子类,它添加了另一个属性:

class A(object):

    _print_dict = {"a": "ms"}

    def __init__(self):
        self.a = 5

    def __str__(self):
        s = ""
        for attr in self._print_dict:
            s += "{} {}\n".format(getattr(self, attr), _print_dict[attr])
        return s

class B(A):

    def __init__(self):
        super(B, self).__init__()
        self.b = 10

我可以在B.__init__中更新,但这会使_print_dict成为实例属性,对吗?

class B(A):

    def __init__(self):
        super(B, self).__init__()
        self.b = 10
        self._print_dict.update({"b": "V"})

在尝试访问_print_dict之外的__init__时,我得到NameError

class B(A):

    _print_dict.update({"b": "V"})

    def __init__(self):
        super(B, self).__init__()
        self.b = 10

self._print_dict显然也是如此,因为在创建类时我没有定义self(我推测)。

有没有办法改变子类_print_dict中的类属性B?不改变课程A也是如此?

编辑:

我显然错过了明确使用父类的名称:

class B(A):

    _print_dict = A._print_dict.copy()
    _print_dict.update({"b": "V"})

    def __init__(self):
        super(B, self).__init__()
        self.b = 10

这是这样做的吗?至少它似乎有用......

1 个答案:

答案 0 :(得分:1)

更新B.__init__中的字典不会使其成为实例属性。相反,您每次创建B的实例时都会修改相同的字典:

>>> class A(object):
...     _print_dict = {"a": "ms"}
...
>>> class B(A):
...     def __init__(self):
...         self._print_dict.update({"b": "V"})
...
>>> A._print_dict is B._print_dict
True # they are the same object
>>> A._print_dict
{'a': 'ms'} # not yet updated
>>> b = B()
>>> A._print_dict is B._print_dict is b._print_dict
True # still the same object
>>> A._print_dict
{'a': 'ms', 'b': 'V'}

如果要在A中保留原始字典,则必须将其复制到B的类定义中。词典方便地有一个方法:

>>> class B(A):
...     _print_dict = A._print_dict.copy()
...     _print_dict.update({'b': 'V'})
...
>>> A._print_dict is B._print_dict
False # now they are two distinct objects
>>> A._print_dict
{'a': 'ms'}
>>> B._print_dict
{'a': 'ms', 'b': 'V'}