gpt4 book ai didi

python单例元类字典与非字典

转载 作者:太空宇宙 更新时间:2023-11-04 00:19:43 24 4
gpt4 key购买 nike

我正在尝试扩展我的 Python 知识。所以我刚刚写了我的第一个单例元类:

class Singleton(type):
_instance = None

def __call__(cls, *args, **kwargs):
if not cls._instance:
cls._instance = super().__call__(*args, **kwargs)
return cls._instance

我刚刚查看了(反馈)旧的 stackoverflow。让我们看看“其他人是怎么做的”,我找到了这个解决方案:

class Singleton(type):
_instances = {}

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

有人可以向我解释为什么(黑客)我们需要那本字典吗?

最佳答案

这是为了支持继承。使用您的解决方案,继承自使用 Singleton 元类构建的类不允许子类拥有自己的单例。

class Singleton(type):
_instance = None

def __call__(cls, *args, **kwargs):
if not cls._instance:
cls._instance = super().__call__(*args, **kwargs)
return cls._instance

class FirstSingleton(metaclass=Singleton):
pass

class SecondSingleton(FirstSingleton):
pass

x = FirstSingleton()
y = SecondSingleton()

x is y # True

如您所见,调用 FirstSingleton()SecondSingleton() 都返回相同的实例。

但是使用字典允许一个类及其子类有不同的单例。

class Singleton(type):
_instances = {}

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

class FirstSingleton(metaclass=Singleton):
pass

class SecondSingleton(FirstSingleton):
pass

x = FirstSingleton()
y = SecondSingleton()

x is y # False

类和子类各自返回它们自己的单例实例。

关于python单例元类字典与非字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49634224/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com