如何制作Cython对象的副本?

4 c python cython

我有一个简单的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)类.

hiv*_*ert 5

您应该__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__.然后它将用于复制.