我正在尝试向 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

这是什么导致此错误?有没有办法使用委托(delegate),以便我的新类的行为与原始类完全相同?

最佳答案

ll_mat 被记录为 function —— 不是类型本身。这个习惯用法被称为“工厂函数”——它允许“创建者可调用”根据其参数返回不同的实际底层类型。

您可以尝试从中生成一个对象,然后从该对象的类型继承:

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

但是请注意,内置类型声明它不支持子类化是非常可行的(即使只是为了节省一些适度的开销,也可以这样做);如果这就是该类型的作用,那么您不能对其进行子类化,而必须使用包含和委托(delegate),即:
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)

等等等等。

10-07 16:03