使用Cython定义Python类方法
我试图将一些Python代码移植到Cython,结果证明,我尝试移植的一些功能需要类方法(在Python代码库中使用使用Cython定义Python类方法,python,cython,pyrex,Python,Cython,Pyrex,我试图将一些Python代码移植到Cython,结果证明,我尝试移植的一些功能需要类方法(在Python代码库中使用@classmethod定义) 是否可以使用Cython创建Python类方法?如果是,它们是否会遵循与Python中相同的范围规则?我是否能够访问在类的实例上定义的cdef方法?它们工作正常,行为基本上与Python相同 我是否能够访问在类的实例上定义的cdef方法 我不是100%确定你的意思,因为类方法不在类的实例上操作。如果愿意,他们可以选择创建一个,在这种情况下,cdef方
@classmethod
定义)
是否可以使用Cython创建Python类方法?如果是,它们是否会遵循与Python中相同的范围规则?我是否能够访问在类的实例上定义的
cdef
方法?它们工作正常,行为基本上与Python相同
我是否能够访问在类的实例上定义的cdef方法
我不是100%确定你的意思,因为类方法不在类的实例上操作。如果愿意,他们可以选择创建一个,在这种情况下,cdef
方法可以正常工作:
cdef class C:
cdef m(self):
pass
@classmethod
def c_meth(cls):
cdef C x = C()
x.m()
cdef
方法之所以有效,是因为x
是cdef
ed到C
的,所以它知道类型。如果你这么做了
@classmethod
def c_meth(cls):
x = C()
x.m()
然后您会得到一个属性错误(在运行时),因为Cython编译器不会将
x
与cdef类C
链接。这是一条一般规则,与之无关,因为classmethod
Pyrex已经过时,并被Cython取代超过5年。你真的想用它吗?是的,我才意识到。将修改我的问题以反映Cython。谢谢您的回答。这澄清了我的大部分疑虑。为了进一步阐述,假设我有这样的代码:`` class A():cdef foo(self):pass@classmethod def bar(cls):foo()``既然foo
是在A
的实例上定义的,那么是否可以从bar
访问foo
(这是一个类方法)?否。但它也不是在Python中foo
需要A
的实例,而bar
只有一个表示类A
的对象。您应该在Python中尝试这段代码,并检查cls
和self
的类型,以了解发生了什么。