我有一个简单的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"
Run Code Online (Sandbox Code Playgroud)
如果我在Python中创建MyClass的实例然后复制它,它会破坏对象:
import copy
myobj = MyClass(5, 10)
myobj_copy = copy.copy(myobj)
# myobj_copy is now defective
# ..
Run Code Online (Sandbox Code Playgroud)
创建Cython类实例副本的正确方法是什么?我想制作一个副本然后修改它而不影响原始对象.更新要明确,MyClass还继承了另一个Cython(cdef)类.
您应该__copy__为您的类定义一个方法.添加例如.
def __copy__(self):
return MyClass(self.a, self.b)
Run Code Online (Sandbox Code Playgroud)
你的代码给出:
>>> import cp
>>> foo = cp.MyClass(5, 10)
>>> import copy
>>> bar = copy.copy(foo)
>>> bar == foo
True
Run Code Online (Sandbox Code Playgroud)
作为替代方案,如果您还想要挑选对象,您可能希望实现作为方法的扩展类型的pickle协议__reduce__.然后它将用于复制.