我可以在python中创建单例静态类变量吗?

时间:2018-12-03 18:38:10

标签: python python-3.x instance static-variables

我有以下情况:

class A:
   b = 1
   pass

x = A()
y = A()

我是否可以更改此类,以使x.b = 2等效于A.b = 2,我的意思是,当更改一个实例的静态变量时,所有实例都被更改了吗?

编辑:我希望能够使用该类的多个不同实例。

1 个答案:

答案 0 :(得分:2)

可以,但是有点丑陋:

class A:
    b = 1
    def __setattr__(self, name, value):
        if name == "b":
            setattr(A, "b", value)
        else:
            super().__setattr__(name, value)

现在可以按预期运行:

>>> a = A()
>>> a.b = 3
>>> A.b
3
>>> A.b = 5
>>> a.b
5

真正的问题是:为什么要这么做?


如果您打算经常使用它,最好为其编写一个装饰器:

def sharedclassvar(variable):
    def __setattr__(self, name, value):
        if name in self.__class__._sharedclassvars:
            setattr(self.__class__, name, value)
        elif hasattr(self.__class__, "__oldsetattr__"):
            self.__class__.__oldsetattr__(self, name, value)
        else:
            super().__setattr__(name, value)
    def decorator(cls):
        if not hasattr(cls, "_sharedclassvars"):
            cls._sharedclassvars = []
            if hasattr(cls, "__setattr__"):
                cls.__oldsetattr__ = getattr(cls, "__setattr__")
                cls.__setattr__ = __setattr__
        cls._sharedclassvars.append(variable)
        return cls
    return decorator

然后您可以定义这样的类:

@sharedclassvar("b")
class A:
    b = 1