首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >深度复制不尊重元类

深度复制不尊重元类
EN

Stack Overflow用户
提问于 2012-03-27 10:13:03
回答 1查看 590关注 0票数 4

我有一门课程,从设计上讲,必须遵循单例模式。因此,我继续使用元类来实现它。所有操作都很好,直到报告了一个bug,总之,报告中说我的单例类的deepcopy-ied实例不是相同的实例。

我可以通过继承一个基本的单例类型类来避免这个错误,但我宁愿不这样做,因为在this question中指出了一些原因。

以下是这一问题的一个工作实例:

代码语言:javascript
复制
class SingletonMeta(type):
    def __init__(cls, name, bases, dict):
        super(SingletonMeta, cls).__init__(name, bases, dict)
        cls.instance = None 
    def __call__(cls,*args,**kw):
        print "SingletonMeta __call__ was called"
        if cls.instance is None:
            cls.instance = super(SingletonMeta, cls).__call__(*args, **kw)
        return cls.instance

class MyClass1(object):
    __metaclass__ = SingletonMeta

class SingletonBase(object):
    _instance = None
    def __new__(class_, *args, **kwargs):
        print "SingletonBase __new__ was called"
        if not isinstance(class_._instance, class_):
            class_._instance = object.__new__(class_, *args, **kwargs)
        return class_._instance

class MyClass2(SingletonBase):
  pass

from copy import deepcopy as dcp

mm1 = MyClass1()
mm2 = dcp(mm1)
print "mm1 is mm2:", mm1 is mm2

mb1 = MyClass2()
mb2 = dcp(mb1)
print "mb1 is mb2:", mb1 is mb2

输出:

代码语言:javascript
复制
SingletonMeta __call__ was called
mm1 is mm2: False
SingletonBase __new__ was called
SingletonBase __new__ was called
mb1 is mb2: True

你能给我一些关于如何解决这个问题的建议吗?我正在运行Python2.7.X

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-03-27 10:26:19

copy模块上的文档如下:

为了让类定义自己的副本实现,它可以定义特殊的方法__copy__()__deepcopy__()。..。后者被调用以实现深度复制操作;它被传递给一个参数,即备忘录字典。..。

因此,如果您声明这些返回self,这应该可以做到这一点。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9887501

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档