我正在尝试从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
这是什么导致此错误?有没有办法使用委托,以便我的新类的行为与原始类完全相同?
答案 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)
等等。