2010-04-04 84 views
6

我想從pysparse庫中添加一些額外的方法到矩陣類型。除此之外,我希望新類的行爲與原始類完全相同,所以我選擇使用繼承來實現更改。然而,當我嘗試Python:無法從C擴展繼承

from pysparse import spmatrix 

class ll_mat(spmatrix.ll_mat): 
    pass 

這將導致以下錯誤

TypeError: Error when calling the metaclass bases 
    cannot create 'builtin_function_or_method' instances 

這是什麼導致這個錯誤?有沒有辦法使用委派,以便我的新類的行爲與原始方式完全相同?

回答

9

ll_mat被記錄爲function - 不是類型本身。這個成語被稱爲「工廠函數」 - 它允許「創建者可調用」根據其參數返回不同的實際基礎類型。

你可以嘗試從這個生成的對象,然後從該對象的類型繼承:

x = spmatrix.ll_mat(10, 10) 
class ll_mat(type(x)): ... 

知道,雖然,它是一個內置的類型來聲明它不支持完全可行被分類(這可以做甚至只是爲了節省一些適度的開銷);如果這是該類型做什麼,那麼你就無法繼承它,並會寧願使用遏制和代表團,即:

class ll_mat(object): 
    def __init__(self, *a, **k): 
     self.m = spmatrix.ll_mat(*a, **k) 
     ... 
    def __getattr__(self, n): 
     return getattr(self.m, n) 

等等,等等