Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Cython定义Python类方法_Python_Cython_Pyrex - Fatal编程技术网

使用Cython定义Python类方法

使用Cython定义Python类方法,python,cython,pyrex,Python,Cython,Pyrex,我试图将一些Python代码移植到Cython,结果证明,我尝试移植的一些功能需要类方法(在Python代码库中使用@classmethod定义) 是否可以使用Cython创建Python类方法?如果是,它们是否会遵循与Python中相同的范围规则?我是否能够访问在类的实例上定义的cdef方法?它们工作正常,行为基本上与Python相同 我是否能够访问在类的实例上定义的cdef方法 我不是100%确定你的意思,因为类方法不在类的实例上操作。如果愿意,他们可以选择创建一个,在这种情况下,cdef方

我试图将一些Python代码移植到Cython,结果证明,我尝试移植的一些功能需要类方法(在Python代码库中使用
@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
的类型,以了解发生了什么。