python - Python 中的单例对象和复制模块

标签 python copy singleton

我定义了这个单例元类:

class Singleton(type):
    """Metaclass which implements the singleton pattern"""

    _instances = {}

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

现在,我想测试一下是否一切正常。这是我尝试过的:

  • 我创建了同一类的两个对象(具有 Singleton 作为元类的类)- 它们的 id() 匹配
  • 我创建了一个对象并将其分配给第二个变量 - 它们的 id() 匹配
  • 我导入了 copy 模块并使用 copy.copy() 复制了第一个对象 - 它们的 id() 现在不匹配

我想知道为什么复制的对象的 id 与原始对象不匹配。既然是单例,那两个对象不应该有相同的id吗?

最佳答案

copy 模块创建一个新实例;相反,它创建一个空类,并在该对象上重新分配 __class__ 以专门避免 __new____init__ 方法原来的。

您需要提供一个自定义的 __copy__ 钩子(Hook)来返回未更改的实例:

class Singleton(type):
    """Metaclass which implements the singleton pattern"""

    _instances = {}

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

    def __copy__(cls, instance):
        return instance

copy直接在类上查找__copy__方法;它是在 元类 上找到的,在该类上查找 __copy__ 将返回一个绑定(bind)方法,并且 copy(期望未绑定(bind)方法)通过在实例中明确。这意味着将有两个 参数传递给__copy__;第一个是类(元类的实例),第二个是该类的实例(传统方法中的 self)。

不幸的是,__deepcopy__ 是在实例上查找的,但未找到元类方法。

关于python - Python 中的单例对象和复制模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18870851/

相关文章:

python - 有没有读取ms office文件底层xml的python包?

python - 如何避免 Papermill 中名为 'kernelspec' 的 Keyerror?

javascript - 如何使用javascript将选定的文本复制到剪贴板

windows - 为什么 FileStream 和 CopyFile 比 Windows Explorer 慢这么多?

r - 准确了解 data.table 何时是对另一个 data.table 的引用(相对于副本)

TDD 友好类单例类

python - 由exec(variable =)在for循环中分配的变量范围?

python - os.path.exists 不适用于特定目录

objective-c - Cocoa 单例和协议(protocol)

c# - 如何使 MVC 5 session 中的 Singleton 特定?