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

时间:2012-04-15 00:38:34

标签: python

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

我尝试了以下内容:

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

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

有关强大实施的任何想法吗?

2 个答案:

答案 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

...