首页 > 解决方案 > 我可以在 python 中创建一个单例静态类变量吗?

问题描述

我有以下情况:

class A:
   b = 1
   pass

x = A()
y = A()

我可以更改此类,以便x.b = 2等效于A.b = 2,我的意思是,当更改一个实例的静态变量时,它会更改所有实例?

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

标签: pythonpython-3.xinstancestatic-variables

解决方案


你可以,但它有点难看:

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

推荐阅读