繁体   English   中英

Cython-试图修改已经在超类中声明的子类中的函数,但是会发生错误

[英]Cython - trying to modify function in subclass which is already declared in superclass , but error occurs

我在jupyter-notebook中编码了这四个类。 前两个类在python中,其他两个具有类似操作的类在cython中:

%load_ext cython

%%cython

# py_child inherits from py_parent
class py_parent:
    def __init__(self, var1, var2):
        self.var1 = var1
        self.var2 = var2

    def func1(self):
        return self.var1 + self.var2

    def func2(self):
        return self.var1 * self.var2

    class py_child(py_parent):
        def func1(self, inp):
            return self.var1 + self.var2, self.var1 + inp, self.var2 + inp

# In the next cell I coded these modules
# cy_child inherits from cy_parent

cdef class cy_parent:
    cdef public:
        int var1, var2
    def __init__(self, var1, var2):
        self.var1 = var1
        self.var2 = var2

    cpdef int func1(self):
        return self.var1 + self.var2

    cpdef int func2(self):
        return self.var1 * self.var2

cdef class cy_child(cy_parent):
    def __init__(self, var1, var2):
        super().__init__(var1, var2)

    cpdef tuple func1(self, int inp):
        return self.var1 + self.var2, self.var1 + inp, self.var2 + inp

我在下面为python类运行代码,并且效果很好:

a = py_child(1,1)
print(a.func1(2)) 

但是对于cy_child和cy_parent我得到这个错误:

cpdef tuple func1(self, int inp):
     ^
------------------------------------------------------------

Signature not compatible with previous declaration

之后,我还会收到此错误: Call with wrong number of arguments (expected 1, got 2)

为什么cython类而不是python类会发生此错误。
假设我希望超类cy_parent保持func1函数不变,并希望按照我展示的方式修改其子类cy_child.func1函数。 那我该如何解决错误呢? 任何建议将不胜感激。

如果将cpdef更改为def ,这将“起作用”,但是您所做的没有任何意义。

继承通常表示“是”关系-即cy_childcy_parent并且应该能够执行cy_parent可以做的所有事情(可能还有其他一些事情)。 因此,可以在任何可以使用cy_parent代码中使用cy_parent 通过尝试更改函数签名,您可以使它可以做更长的相同的事情,从而打破了该规则。

使用cpdef函数,您可以要求Cython生成代码,以便无论是否传递了cy_parentcy_child ,以下代码都会生成对正确函数的快速C函数调用:

def example(cy_parent x):
  x.func1()

由于函数采用不同数量的参数,因此无法执行此操作,因此Cython(正确)会抱怨。 使用纯Python代码,您可以先解决问题,直到运行代码为止,但是问题仍然存在(关于错误数量的参数,您将获得异常)。

有两个“解决方案”:

  1. 您不应该使用继承,因为它不代表您要尝试编码的模型。
  2. 如果您只是想在cy_child上添加额外的功能,则应给新功能起一个不同的名称(因为它的功能有所不同)。 这代表您仍然希望能够将cy_parentfunc1cy_child一起使用的情况,但您还希望通过额外的参数选择执行类似操作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM