如何制作Cython对象的副本?

时间:2014-03-03 21:10:30

标签: python c 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"

如果我在Python中创建MyClass的实例然后复制它,它会破坏对象:

import copy
myobj = MyClass(5, 10)
myobj_copy = copy.copy(myobj)
# myobj_copy is now defective
# ..

创建Cython类实例副本的正确方法是什么?我想制作一个副本然后修改它而不影响原始对象。 更新要明确,MyClass还继承了另一个Cython(cdef)类。

1 个答案:

答案 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。然后它将用于复制。