单例的哪种用法最多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
本身
我想知道哪种方式是调用单例变量的最佳、最合适或最符合 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
本身