0

次のクラス構造のプロジェクトがあります。

class A(object):
    elems = [1, 2, 3]

class B(A):
    pass

class C(B):
    elems = [20, 100]

class D(B):
    elems = [4, 5]

現在、Pythonのデフォルトの継承動作は、elems後続の各属性宣言で属性を上書きすることです。例:

A.elems == [1, 2, 3]
B.elems == [1, 2, 3]
C.elems == [20, 100]
D.elems == [4, 5]

これらの値の加法リストにアクセスできるようにしたいと思います。つまり、次のリストを取得できるようにしたいと思います。

A.collated() == [1, 2, 3]
B.collated() == [1, 2, 3]
C.collated() == [1, 2, 3, 20, 100]
D.collated() == [1, 2, 3, 4, 5]

これを行う方法がわかりません。どんな助けでも大歓迎です。

よろしくお願いします、
-B

4

2 に答える 2

5

ここでの最も簡単な解決策は、明示的にすることです。

class A(object):
    elems = [1, 2, 3]
    @classmethod
    def collated(cls):
      return sorted(cls.elems)

class B(A):
    pass

class C(B):
    elems = B.elems + [20, 100]

class D(B):
    elems = B.elems + [4, 5]

print "A.collated() == ", A.collated()
print "B.collated() == ", B.collated()
print "C.collated() == ", C.collated()
print "D.collated() == ", D.collated()

これをより自動化するためにできるトリッキーなことがありますが、私はあなたがそうしたいとは思わない. (必要に応じて、まず記述子またはメタクラスがどのように機能するかを読んでから、特定の質問に戻ってください。)

于 2012-12-13T20:59:30.003 に答える
3

明示的に、拡張したい親のクラスインスタンスにアクセスしてください...

class A(object):
    elems = [1, 2, 3]

class B(A):
    elems = A.elems # or pass

class C(B):
    elems = B.elems + [20, 100]

class D(B):
    elems = B.elems + [4, 5]

print A.elems, B.elems, C.elems, D.elems
# [1, 2, 3] [1, 2, 3] [1, 2, 3, 20, 100] [1, 2, 3, 4, 5]
于 2012-12-13T20:59:32.287 に答える