У меня есть класс, который по дизайну должен следовать шаблону singleton. Поэтому я пошел дальше и реализовал его с помощью метакласса. Все работало красиво, пока не сообщалось об ошибке, которая, в общем, говорила, что deepcopy
-идельные экземпляры моего одноэлементного класса не совпадают с экземплярами.
Я могу обойти эту ошибку, наследуя от базового класса одноэлементного типа, но я бы предпочёл не по причинам, указанным в этом вопросе.
Ниже приведен рабочий пример этой проблемы:
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
Выход:
SingletonMeta __call__ was called
mm1 is mm2: False
SingletonBase __new__ was called
SingletonBase __new__ was called
mb1 is mb2: True
Можете ли вы дать мне какие-либо указания относительно того, как решить эту проблему? Я запускаю Python 2.7.X