可以被所有实例(也是子类)访问和设置的类属性
问题描述:
我想设置一个类属性,该类属性可以由类或其子类的所有实例共享。任何实例都应该可以设置属性。可以被所有实例(也是子类)访问和设置的类属性
我试过如下:
class A:
x = 1
@classmethod
def setX(cls, val):
if cls.__bases__:
cls = cls.__bases__[-1]
cls.x = val
这似乎是单一继承的情况下很好地工作。但是,如果我使用多继承,这取决于继承的顺序,它可以工作或不工作(即A类并不总是最后的基地)。
强大实施的任何想法?
答
正确的方法,国际海事组织,是去同一个类属性。由于属性被绑定到对象的类__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
getter和setter方法在Python中一个非常糟糕的做法 - 我不能说,如果这仅仅是问题的缘故一个例子,什么你实际上做。如果是后者,请查看[''property()''builtin /''@ property''装饰器](http://docs.python.org/library/functions.html#property)。 – 2012-04-15 00:42:34
只要使用'A.x'将不起作用? – 2012-04-15 00:44:38