Python:无法从C扩展继承

8 投票
1 回答
5038 浏览
提问于 2025-04-15 21:12

我想在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)

等等等等。

撰写回答