Cython如何在模块级别定义属性的getter与setter函数?
Cython模块级属性getter/setter相关问题解答
Cython原生没有内置你示例中@module_property这类直接定义模块级别属性getter/setter的语法,但可以通过自定义模块类的方式间接实现完全一致的使用效果。
实现原理很简单:Python的模块本质是内置module类型的实例,默认模块属性的读写不会触发描述符协议,所以类层面可以直接用的property语法无法直接应用在模块上,我们可以通过替换当前模块的类来实现支持:
cdef class CustomModule: property a: def __get__(self): cdef int a get_a(&a) return a def __set__(self, int a): set_a(&a) # 模块初始化时替换当前模块的所属类 import sys sys.modules[__name__].__class__ = CustomModule
完成上述定义后,其他代码导入该模块后,直接读写模块名.a就会自动触发对应的__get__和__set__方法,和你预期的功能完全一致。
如果你想要更接近你给出的装饰器写法,也可以自行封装module_property装饰器工具,本质就是动态给自定义模块类添加对应的属性,不过目前Cython没有内置这类语法糖。
内容的提问来源于stack exchange,提问作者nicholaswogan
相关产品推荐
相关产品推荐

