2012-12-13 43 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] 
相关问题