我有一个简单的Cython类,我定义比较两个对象是否相等(==
):
cdef class MyClass:
cdef public int a
cdef public int b
def __init__(self, a, b):
self.a = a
self.b = b
def __richcmp__(self, MyClass other, int op):
if op == 2:
if (self.a == other.a) and (self.b == other.b):
return True
return False
raise Exception, "No other op"
如果我在Python中创建MyClass的实例然后复制它,它会破坏对象:
import copy
myobj = MyClass(5, 10)
myobj_copy = copy.copy(myobj)
# myobj_copy is now defective
# ..
创建Cython类实例副本的正确方法是什么?我想制作一个副本然后修改它而不影响原始对象。 更新要明确,MyClass还继承了另一个Cython(cdef
)类。
答案 0 :(得分:5)
您应该为您的班级定义__copy__
方法。添加例如。
def __copy__(self):
return MyClass(self.a, self.b)
代码给出:
>>> import cp
>>> foo = cp.MyClass(5, 10)
>>> import copy
>>> bar = copy.copy(foo)
>>> bar == foo
True
作为替代方案,如果您还需要挑选对象,则可能需要实现__reduce__
方法The pickle protocol for extension type。然后它将用于复制。