我试图定义一个Cython类,它接受一个函数作为__init__
函数中的一个类属性。
我关注了this question并尝试了以下
ctypedef int (*f_type)(int, int)
cdef class ClassWFunction:
cdef f_type f
def __init__( self, f_type f):
self.f = f
def doStuff(self, int x, int y):
return self.f(x, y)
cdef int example_f(int a, int b):
return a*b
classInstance = ClassWFunction(example_f)
classInstance.doStuff(2, 4)
给了我错误:
Cannot convert 'int (int, int)' to Python object
我还阅读了Cython的文档中的this page并尝试了这种方法:
cdef class f_type:
cpdef int evaluate(self, int a, int b) except *:
return 0
cdef class ClassWFunctionV2:
cdef f_type f
def __init__( self, f_type f):
self.f = f
def doStuff(self, int a, int b):
return self.f.evaluate(a, b)
cdef class example_f(f_type):
cpdef int evaluate(self, int a, int b) except *:
return a*b
classInstance = ClassWFunctionV2(example_f)
classInstance.doStuff(3, 4)
给了我一个TypeError
:
TypeError: Argument 'f' has incorrect type (expected _cython_magic_9f51dc40b83b28506fce9fb260a84618.f_type, got type)
希望有一种方法可以让我的第一次尝试工作,因为第二种方法有很多样板,我不太明白! 谢谢你的时间......
--------编辑----------
以这种方式编写代码的重点是双重的:
1)在实例化类时有一种灵活的方式来更改f
函数。
2)f
函数在许多类方法中被重用,所以我想将它分配给self
在我的纯Python代码中,我做了像
这样的事情def f1(x): return x**2
def f2(x): return x**3
cl1 = ClassWFunction(f1)
cl2 = ClassWFunction(f2)
然后继续用这些类做事。但是,我并不是100%确定这是最好的方式,所以请随意提出不同的方法。
-------- Edit2 ----------
作为一个不太灵活但(希望!)更容易的替代方案,我试图将该函数硬编码到类上。这符合上面的目标(2),即使它不符合目标(1)。
考虑(这也会产生错误)
ctypedef int (*f_type)(int)
cdef class ClassWFunction:
cdef f_type example_f
cdef double x
def __init__( self, int x):
self.x = x
# Tried with a python function too
cdef int example_f(int z):
return x*z
self.example_f = example_f
def doStuff(self, int x, int y):
return self.example_f(x)*y
classInstance = ClassWFunction(3)
classInstance.doStuff(2, 4)