我想设置一个可以由类或其子类的所有实例共享的类属性。任何实例都应该可以设置属性。
我尝试了以下内容:
class A:
x = 1
@classmethod
def setX(cls, val):
if cls.__bases__:
cls = cls.__bases__[-1]
cls.x = val
在单继承的情况下,这似乎工作正常。但是,如果我使用多重继承,取决于继承的顺序,它可以工作或不工作(即,A类并不总是 base 的最后一个)。
有关强大实施的任何想法吗?
答案 0 :(得分:2)
使用词汇范围:
class A(object):
x = 1
@classmethod
def setX(cls, val):
A.x = val
答案 1 :(得分:1)
IMO的正确方法是使用类属性。由于属性绑定到对象的类__dict__
,而不是对象的自己的__dict__
,并且因为您的对象恰好是一个类,所以必须将它附加到类类,它的元类:< / p>
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
此外,您的类必须是新样式类,即它们必须从Python 2.x中的object
继承。在Python 3.x中,元类的定义也不同:
class MetaA(type):
""" like ___metaclass__ above """
class A(metaclass=MetaA):
_x = None
...