2014-03-03 54 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