2012-12-13 69 views
0

我有下面的類結構工程:Python類的屬性可以相加嗎?

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

我想:

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.collated() == [1, 2, 3] 
B.collated() == [1, 2, 3] 
C.collated() == [1, 2, 3, 20, 100] 
D.collated() == [1, 2, 3, 4, 5] 

我不知道該怎麼做。任何幫助將不勝感激。

由於提前,
- B

+3

你確定你真的希望這些是類成員(並且'collat​​ed'是'@ classmethod')嗎?因爲這是一種奇怪的設計 - 這種類型的東西在Javascript中完全適用,但在Python中很少。 – abarnert

回答

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() 

棘手的事情可以做,以使這更自動的,但我不要以爲你想。 (如果你認爲你想,先下去或者描述或元類是如何工作的讀了起來,然後再來具體問題。)

+0

有一天我會弄清楚是怎麼回事元類......(這就是我說過的描述太 - 最終我抽時間去搞清楚那些出;) – mgilson

+0

@mgilson它們實際上是不是太糟糕 - 堅持上課裝飾在可能的情況總體上是好的,但(和止痛片)metametaclasses的樂趣雖然:) –

+0

@mgilson:如果你還沒有學會尚未元類,我會等到你準備好了一切,3.x和學習「簡化」版本。特別是如果他們要在3.4或3.5中再次改變它們。 – abarnert

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] 
相關問題