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)

いえ

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 Bclass Cclass 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 に答える