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