可由所有实例(包括子类)访问和设置的类属性



我想设置一个可以由类或其子类的所有实例共享的类属性。 任何实例都应该可以设置该属性。

我尝试了以下方法:

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
...

最新更新