2014-03-03 57 views
3

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

回答

4

你应该为你的班级定义一个__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 

作为替代方案,如果你想也咸菜你的对象,你可能要实现The pickle protocol for extension type这是一个__reduce__方法。然后它将被用于复制。

+0

你的意思是''将复制导入为cp''? – user248237dfsf

+0

@ user248237dfsf:非!我在“cp.pyx”这个名字下编写了你的​​代码,编译成了'cp.so',因此我使用'import cp'导入它。 – hivert