【问题标题】:Can I create a singleton static class variable in python?我可以在 python 中创建一个单例静态类变量吗?
【发布时间】:2019-05-05 02:33:22
【问题描述】:

我有以下场景:

class A:
   b = 1
   pass

x = A()
y = A()

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

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

【问题讨论】:

    标签: python python-3.x instance static-variables


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-10
      • 2010-09-09
      • 1970-01-01
      • 2017-03-23
      • 2012-12-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多