Могу ли я создать одноэлементную переменную статического класса в python?

У меня есть следующий сценарий:

class A:
   b = 1
   pass

x = A()
y = A()

Могу ли я изменить этот класс так, чтобы x.b = 2 был эквивалентен A.b = 2, я имею в виду, что при изменении статической переменной для одного экземпляра она изменяется для всех экземпляров?

Изменить: я хочу иметь возможность работать с несколькими экземплярами этого класса.


person Leonardo Moraes    schedule 03.12.2018    source источник


Ответы (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
person L3viathan    schedule 03.12.2018