0

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

我尝试了以下方法:

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

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

任何关于稳健实施的想法?

4

2 回答 2

2

使用词法作用域:

class A(object):
    x = 1
    @classmethod
    def setX(cls, val):
        A.x = val
于 2012-04-15T00:40:42.773 回答
1

IMO,正确的方法是使用类属性。由于属性与对象的 classes 相关联__dict__,而不是对象自己的__dict__,并且由于您的对象恰好是一个类,因此您必须将其附加到 classes 类,即它的元类:

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

此外,您的类必须是新样式类,即它们必须继承自objectPython 2.x。元类在 Python 3.x 中的定义不同:

class MetaA(type):
    """ like ___metaclass__ above """

class A(metaclass=MetaA):

    _x = None

...
于 2012-04-15T01:20:34.737 回答