可以被所有实例(也是子类)访问和设置的类属性

问题描述:

我想设置一个类属性,该类属性可以由类或其子类的所有实例共享。任何实例都应该可以设置属性。可以被所有实例(也是子类)访问和设置的类属性

我试过如下:

class A: 
    x = 1 
    @classmethod 
    def setX(cls, val): 
     if cls.__bases__: 
      cls = cls.__bases__[-1] 
     cls.x = val 

这似乎是单一继承的情况下很好地工作。但是,如果我使用多继承,这取决于继承的顺序,它可以工作或不工作(即A类并不总是最后的基地)。

强大实施的任何想法?

+3

getter和setter方法在Python中一个非常糟糕的做法 - 我不能说,如果这仅仅是问题的缘故一个例子,什么你实际上做。如果是后者,请查看[''property()''builtin /''@ property''装饰器](http://docs.python.org/library/functions.html#property)。 – 2012-04-15 00:42:34

+0

只要使用'A.x'将不起作用? – 2012-04-15 00:44:38

正确的方法,国际海事组织,是去同一个类属性。由于属性被绑定到对象的类__dict__,而不是对象的自己__dict__,并且因为你的对象恰好是一类,则必须将其附加到类的类,它的元类:

class A(object): 

    _x = None 

    class __metaclass__(type): 

     @property 
     def x(cls): 
      return A._x 

     @x.setter 
     def x(cls, val): 
      A._x = val 


class B(A): 
    pass 

A.x = 'jim' 
B.x = 'joe' 

print A.x, B.x 

结果:

joe joe 

另外,你的类必须是新样式类,即它们必须从object在Python 2.x版本继承和元类在Python 3.x都有不同的定义:

class MetaA(type): 
    """ like ___metaclass__ above """ 

class A(metaclass=MetaA): 

    _x = None 

... 

使用词汇范围:

class A(object): 
    x = 1 
    @classmethod 
    def setX(cls, val): 
     A.x = val