添加到子class中的parentclass的class属性
Add to parentclass's class attribute in subclass
我这里可能走错了路,所以如果我的做法是假的,请指教。
基本上我有一个 class,它有一个包含每个 属性 的打印信息的字典。我创建了这个 class 的 child 添加了另一个 属性:
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"})
然而,当我尝试在 __init__
之外访问 _print_dict
时,我得到一个 NameError
:
class B(A):
_print_dict.update({"b": "V"})
def __init__(self):
super(B, self).__init__()
self.b = 10
self._print_dict
显然也会发生同样的情况,因为在创建 class 时未定义 self
(我推测)。
有没有办法改变 subclass B
中的 class 属性 _print_dict
? class A
也不更改吗?
编辑:
我显然错过了明确使用 parent class 的名字:
class B(A):
_print_dict = A._print_dict.copy()
_print_dict.update({"b": "V"})
def __init__(self):
super(B, self).__init__()
self.b = 10
是这样吗?至少它似乎有效...
更新 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定义中。字典有一个方便的方法:
>>> 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'}
我这里可能走错了路,所以如果我的做法是假的,请指教。
基本上我有一个 class,它有一个包含每个 属性 的打印信息的字典。我创建了这个 class 的 child 添加了另一个 属性:
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"})
然而,当我尝试在 __init__
之外访问 _print_dict
时,我得到一个 NameError
:
class B(A):
_print_dict.update({"b": "V"})
def __init__(self):
super(B, self).__init__()
self.b = 10
self._print_dict
显然也会发生同样的情况,因为在创建 class 时未定义 self
(我推测)。
有没有办法改变 subclass B
中的 class 属性 _print_dict
? class A
也不更改吗?
编辑:
我显然错过了明确使用 parent class 的名字:
class B(A):
_print_dict = A._print_dict.copy()
_print_dict.update({"b": "V"})
def __init__(self):
super(B, self).__init__()
self.b = 10
是这样吗?至少它似乎有效...
更新 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定义中。字典有一个方便的方法:
>>> 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'}