python - 我可以在 python 中创建一个单例静态类变量吗?
问题描述
我有以下情况:
class A:
b = 1
pass
x = A()
y = A()
我可以更改此类,以便x.b = 2
等效于A.b = 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
推荐阅读
- mysql - 如何在 MySQL 5.7 中实现类似于“SKIP LOCKED”的功能?
- ruby-on-rails - 以最佳方式将字符串数组值转换为哈希
- docusignapi - 如何使用docusign api在php现有网站中集成docusign电子签名功能
- javascript - Next.js 路由器在刷新时未从 url 获取查询
- javascript - 在 JavaScript 中,如何循环遍历数组并将这些元素作为键添加到空对象中?
- android - Samsung Knox 示例应用 INSTALL_FAILED_DUPLICATE_PERMISSION 和 java.lang.SecurityException:管理员没有 android.permission.sec.MDM_APP_MGMT
- r - 如何为每个变量重新编码具有不同值的多个变量
- c++ - 使用方法类更改指向方法类的指针
- java - 日期未显示,因为我使用 java 在 JDateChooser 中对其进行了自定义
- bash - 从 bash 脚本中触发通知