Python copy.deepcopy使用自定义的新方法()在对象上引发TypeError
我想实现一种符号类型,它跟踪我们已经拥有的符号(保存在Python copy.deepcopy使用自定义的新方法()在对象上引发TypeError,python,deep-copy,Python,Deep Copy,我想实现一种符号类型,它跟踪我们已经拥有的符号(保存在\u sym\u table中),如果它们存在,就返回它们,否则就创建新的符号。守则: # -*- coding: utf-8 -*- _sym_table = {} class Symbol(object): def __new__(cls, sym): if sym not in _sym_table: return super().__new__(cls) else:
\u sym\u table
中),如果它们存在,就返回它们,否则就创建新的符号。守则:
# -*- coding: utf-8 -*-
_sym_table = {}
class Symbol(object):
def __new__(cls, sym):
if sym not in _sym_table:
return super().__new__(cls)
else:
return _sym_table[sym]
def __init__(self, sym):
self.sym = sym
_sym_table[sym] = self
def __str__(self):
return self.sym
def __cmp__(self, other):
return self is other
def __hash__(self):
return self.sym.__hash__()
但当我在此类Symbol
实例列表上调用copy.deepcopy
时,会引发异常:
a = Symbol('a')
b = Symbol('b')
s = [a, b]
t = copy.deepcopy(s)
错误消息:
Traceback (most recent call last):
File "xxx.py", line 7, in <module>
t = copy.deepcopy(s)
File "/usr/lib/python3.2/copy.py", line 147, in deepcopy
y = copier(x, memo)
File "/usr/lib/python3.2/copy.py", line 209, in _deepcopy_list
y.append(deepcopy(a, memo))
File "/usr/lib/python3.2/copy.py", line 174, in deepcopy
y = _reconstruct(x, rv, 1, memo)
File "/usr/lib/python3.2/copy.py", line 285, in _reconstruct
y = callable(*args)
File "/usr/lib/python3.2/copyreg.py", line 88, in __newobj__
return cls.__new__(cls, *args)
TypeError: __new__() takes exactly 2 arguments (1 given)
回溯(最近一次呼叫最后一次):
文件“xxx.py”,第7行,在
t=复制。深度复制(s)
文件“/usr/lib/python3.2/copy.py”,第147行,在deepcopy中
y=复印机(x,备忘)
文件“/usr/lib/python3.2/copy.py”,第209行,在深度复制列表中
y、 附加(副本(a、备忘录))
文件“/usr/lib/python3.2/copy.py”,第174行,在deepcopy中
y=_(x,rv,1,备忘录)
文件“/usr/lib/python3.2/copy.py”,第285行,在
y=可调用(*args)
文件“/usr/lib/python3.2/copyreg.py”,第88行,在__
返回cls.\uuuu新建\uuuuu(cls,*args)
TypeError:\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
因此,我的问题是:
- 如何使用自定义的
方法在这些对象上进行深度复制李>\uuuu new\uuu
- 以及关于何时以及如何使用
的任何建议李>copy.deepcopy
非常感谢 在我看来,您希望符号实例为单例。但是,当您需要一个实例的精确副本,即与原始实例相同的另一个实例时,应该使用Deepcopy
所以这里的用法有点违背了deepcopy的目的。如果您想让它以任何方式工作,您可以在Symbol上定义方法 一个问题是
deepcopy
和copy
无法知道要传递给\uuuuuu new\uuuuu
的参数,因此它们只适用于不需要构造函数参数的类
您可以使用\uuuuuuuuuuuuuuuuuuu
参数的原因是,复制对象时不会调用\uuuuuuuuuuuuuuu
,但必须调用\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu新建
才能创建新对象
因此,如果您想要控制复制,您必须定义特殊的\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
和\uuuuuuuuuuuuuuuuu
方法:
def __copy__(self):
return self
def __deepcopy__(self, memo):
return self
顺便说一句,在python中,是而且不是真正需要的。定义
\uuu getnewargs\uuu
-这样,您不仅能够复制和深度复制,而且还能够pickle