Могу ли я создать в Python переменную одноэлементного статического класса?
У меня есть следующий сценарий:
class A:
b = 1
pass
x = A()
y = A()
Могу ли я изменить этот класс так, чтобы x.b = 2
эквивалентно A.b = 2
Я имею в виду, когда изменить статическую переменную для одного экземпляра, она изменилась для всех экземпляров?
Изменить: я хочу иметь возможность работать с несколькими различными экземплярами этого класса.
1 ответ
Решение
Можно, но это некрасиво
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