我可以在 python 中创建一个单例静态 class 变量吗?
Can I create a singleton static class variable in python?
我有以下场景:
class A:
b = 1
pass
x = A()
y = A()
我可以更改此 class 以便 x.b = 2
等同于 A.b = 2
,我的意思是,当更改一个实例的静态变量时它会更改所有实例?
编辑:我希望能够处理此 class 的多个不同实例。
可以,但是有点丑:
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
然后您可以这样定义 class:
@sharedclassvar("b")
class A:
b = 1
我有以下场景:
class A:
b = 1
pass
x = A()
y = A()
我可以更改此 class 以便 x.b = 2
等同于 A.b = 2
,我的意思是,当更改一个实例的静态变量时它会更改所有实例?
编辑:我希望能够处理此 class 的多个不同实例。
可以,但是有点丑:
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
然后您可以这样定义 class:
@sharedclassvar("b")
class A:
b = 1