我将如何向cython类添加静态typed成员?添加类型化的instance-members的语法使用以下语法(例如:):
import cython
cdef class NoStaticMembers:
cdef public int instanceValue # but, how do I create a static member??
def __init__(self, int value):
self.instanceValue = value
仅仅因为您可以在C语言中完成它并不意味着您可以在Cython中做到。
工作周期可能涉及使用全局变量和类属性,因此您可以通过类实例访问它们。我不确定这是否真的比使用全局变量好]
import cython
cdef int MyClass_static_variable
cdef class MyClass:
property static_variable:
def __get__(self):
return MyClass_static_variable
def __set__(self, x):
global MyClass_static_variable
MyClass_static_variable = x
您必须测量通过该方法损失的速度(如果可以的话,也许可以考虑制作__get__
和__set__
cpdef
-我不确定)。唯一不允许您执行真正的静态变量的操作是以MyClass.static_variable
的身份对其进行访问。
另一种解决方法(具有嵌套类,这是一种特定的类属性):
from cpython.object cimport PyTypeObject, PyObject
from cpython.dict cimport PyDict_SetItem
cdef class Test1:
pass
cdef class Test2:
pass
# Building something close to:
#
# class Test1:
# class Test2:
# pass
PyDict_SetItem(<object>(<PyTypeObject*>Test1).tp_dict, 'Test2', Test2)
del globals()['Test2']
似乎有效(期望例外):
>>> import mymodule
>>> mymodule.Test1
<class 'mymodule.Test1'>
>>> mymodule.Test2
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: module 'mymodule' has no attribute 'Test2'
>>> mymodule.Test1.Test2
<class 'mymodule.Test2'>
我在这里使用嵌套类,但是可以是任何东西。
不是100%干净:
<class 'cyb.toolbox.Test1.Test2'>
作为我上一次查询的结果(可以解决,但我们需要更多技巧吗?)