我想设置一个可以由类或其子类的所有实例共享的类属性。 任何实例都应该可以设置该属性。
我尝试了以下方法:
class A:
x = 1
@classmethod
def setX(cls, val):
if cls.__bases__:
cls = cls.__bases__[-1]
cls.x = val
在单一继承的情况下,这似乎工作正常。 但是,如果我使用多重继承,根据继承的顺序,它要么有效,要么无效(即,类 A 并不总是最后一个基础)。
对稳健的实施有什么想法吗?
使用词法范围:
class A(object):
x = 1
@classmethod
def setX(cls, val):
A.x = val
IMO 的正确方法是使用类属性。由于属性与对象的类__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
此外,你的类必须是新样式的类,即它们必须继承自 Python 2.x 中的object
。元类在Python 3.x中的定义不同:
class MetaA(type):
""" like ___metaclass__ above """
class A(metaclass=MetaA):
_x = None
...