Python:无法从C扩展继承
我想在pysparse库中的矩阵类型上添加一些额外的方法。除此之外,我希望新类的行为和原来的完全一样,所以我选择使用继承来实现这些改动。然而,当我尝试
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
这个错误是怎么回事呢?有没有办法使用委托,让我的新类和原来的表现完全一样?
1 个回答
11
ll_mat
被说明是一个函数,而不是一种类型。这个用法叫做“工厂函数”,它的意思是根据传入的参数,返回不同的实际类型。
你可以尝试从这个函数生成一个对象,然后从这个对象的类型进行继承:
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)
等等等等。