我有这样的类结构:
class A(object):
array = [1]
def __init__(self):
pass
class B(A):
array = [2, 3]
def __init__(self):
super(B, self).__init__()
class C(B):
array = [4]
def __init__(self):
super(C, self).__init__()
print array
当我这样做时:
c = C()
我希望它按继承顺序加入所有字段。并打印[1,2,3,4]。我怎么能这样做?
答案 0 :(得分:4)
当你在每个类中定义array
时,它将覆盖继承类的值。
如果您要执行此操作,请更改类定义,并将array
初始化添加到每个类的__init__(self)
函数中。
即
class A(object):
array = [1]
def __init__(self):
pass
class B(A):
def __init__(self):
super(B, self).__init__()
self.array += [2,3]
class C(B):
def __init__(self):
super(C, self).__init__()
self.array += [4]
print self.array
答案 1 :(得分:2)
要使类在类定义时修改其类属性(在每个类定义中没有样板代码),您需要一个类装饰器或元类。
如果你使用类装饰器,那么你必须单独装饰每个类。
如果您使用元类,class A
的元类将由class B
和class C
继承,因此您只需修改class A
:
class MetaA(type):
def __init__(cls, name, bases, clsdict):
super(MetaA, cls).__init__(name, bases, clsdict)
for base in bases:
if hasattr(base, 'array'):
cls.array = base.array + cls.array
break
class A(object):
__metaclass__ = MetaA
array = [1]
def __init__(self):
pass
class B(A):
array = [2, 3]
def __init__(self):
super(B, self).__init__()
class C(B):
array = [4]
def __init__(self):
super(C, self).__init__()
产量
print(A.array)
# [1]
print(B.array)
# [1, 2, 3]
print(C.array)
# [1, 2, 3, 4]