单例的哪种用法最多proper/pythonic?

Which usage of singleton is the most proper/pythonic?

我想知道哪种方式是调用单例变量的最佳、最合适或最符合 pythonic 的方式。

这是我的单例代码:

class SingletonMeta(type):
    _instances = {}

    def __call__(cls, *args, **kwargs):
        if cls not in cls._instances:
            instance = super().__call__(*args, **kwargs)
            cls._instances[cls] = instance
        return cls._instances[cls]


class Singleton(metaclass=SingletonMeta):
    @classmethod
    def set_value(cls, key, value):
        setattr(cls, key, value)

        return value

    @classmethod
    def get_value(cls, key):
        return getattr(cls, key)

我的第一个方法是这样的:

Singleton.set_value('my_value', True)
print(Singleton.get_value('my_value'))

但对我来说它看起来有点“丑陋”。

所以我将 Singleton class 更改为简单的 pass 然后我可以这样做:

Singleton.my_value = True
print(Singleton.my_value)

为了让 PyCharm 平静下来,我正在添加 Singleton class my_value = None.

我想知道,哪种方法最好?或者我应该换一种方式?

第二种方式最好,但是...

您创建的 SingletonMeta 执行您希望它执行的操作,因为它确保您不能创建多个 Singleton 实例 class。它通过确保每次调用 Singleton() 时返回相同的实例来实现这一点。所以

>>> a = Singleton()
>>> b = Singleton()
>>> a is b
True

解决了这个问题,现在可以了:

>>> a.my_value = True
>>> b.my_value
True

您可以在 class 上像在实例上一样轻松地创建属性,这对于 Python 中的课程来说非常重要。如果您在 class 上创建一个属性,则所有实例都是 'shared',如果您在一个实例上创建它,则它是该实例特有的。由于单例只有一个实例,因此不清楚为什么您想要 create/change 单例 class 本身的属性,而不是实例。可以说,最 Pythonic 的方法是为实例 Singleton() 上的属性赋值,而不是 Singleton 本身