如何向Cython类添加静态成员(从python,而不是C)

问题描述 投票:4回答:2

我将如何向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
python c class static cython
2个回答
2
投票

仅仅因为您可以在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的身份对其进行访问。


0
投票

另一种解决方法(具有嵌套类,这是一种特定的类属性):

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'>作为我上一次查询的结果(可以解决,但我们需要更多技巧吗?)
  • 在PyType_Ready之后修改tp_dict不干净(是吗?)
© www.soinside.com 2019 - 2024. All rights reserved.