3

我有这样的类结构:

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]。我怎样才能做到这一点?

4

2 回答 2

4

好吧,当您array在每个类中定义时,它将覆盖继承类的值。

如果您想这样做,请更改您的类定义,并将array初始化添加到__init__(self)每个类的函数中。

IE

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
于 2013-07-15T17:04:24.643 回答
2

要使类在类定义时修改其类属性(每个类定义中没有样板代码),您需要一个类装饰器或一个元类。

如果您使用类装饰器,则必须单独装饰每个类。

如果您使用元类,class A则 的元类将由class Band继承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]
于 2013-07-15T17:21:58.180 回答