Python:无法从C扩展继承

时间:2010-04-04 04:02:31

标签: python inheritance

我正在尝试从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 个答案:

答案 0 :(得分: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)

等等。