copy.deepcopy对具有自定义的新方法的对象引发TypeError

2024-05-13 18:49:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我想实现一个符号类型,它跟踪我们已经拥有的符号(保存在_sym_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__()

但是,当我调用此类实例列表中的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)

所以我的问题是:

  • 如何使用自定义的__new__方法对这些对象进行深度复制?
  • 关于何时以及如何使用copy.deepcopy有什么建议吗?

非常感谢!


Tags: inpyselfnewreturnlibusrdef