
[英]Trying to randomize which function runs in discord.py But error occurs
[英]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_child
是cy_parent
并且应该能够执行cy_parent
可以做的所有事情(可能还有其他一些事情)。 因此,可以在任何可以使用cy_parent
代码中使用cy_parent
。 通过尝试更改函数签名,您可以使它可以做更长的相同的事情,从而打破了该规则。
使用cpdef
函数,您可以要求Cython生成代码,以便无论是否传递了cy_parent
或cy_child
,以下代码都会生成对正确函数的快速C函数调用:
def example(cy_parent x):
x.func1()
由于函数采用不同数量的参数,因此无法执行此操作,因此Cython(正确)会抱怨。 使用纯Python代码,您可以先解决问题,直到运行代码为止,但是问题仍然存在(关于错误数量的参数,您将获得异常)。
有两个“解决方案”:
cy_child
上添加额外的功能,则应给新功能起一个不同的名称(因为它的功能有所不同)。 这代表您仍然希望能够将cy_parent
的func1
与cy_child
一起使用的情况,但您还希望通过额外的参数选择执行类似操作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.