【发布时间】:2018-07-09 01:29:15
【问题描述】:
我有一个包装类,如下例所示,用 Python 编写。
class Foo:
def __init__(self, bar=None):
if bar:
self._bar = bar
else:
self._bar = CreateBarObject("value")
我通过 Python C API 创建一个实例
// c++ pseudo code for convenience
auto obj = PyObject_CallObject(Foo)
auto bar = CreateBarObject("another_value");
PyObject_SetAttrString(obj, "_bar", bar)
从代码中可以看出,Foo.__init__ 将在创建实例时调用,该实例创建一个新的bar 对象。但我想绕过这个“重”操作。那么创建 Foo 实例的任何安全方法,以便我可以通过 Python C API 设置 self._bar 吗?有什么想法吗?
【问题讨论】:
-
为什么要通过C API设置
_bar?为什么不在初始调用中将bar对象传递给Foo? -
Foo()没有参数需要创建self._bar以使实例工作。但是这个调用是一个非常昂贵的操作,所以我想绕过这个成本加上绕过不必要的字节码指令,如果可能的话,它需要一个非常轻量级的初始化 -
"
Foo()没有参数需要创建self._bar以使实例工作" - 是的,所以 为什么你不传递参数? -
那么
data是什么? -
因为调用
__init__和if bar至少对这个类有显着的性能影响,所以我尝试对其进行优化。顺便说一句,你是对的,数据应该是bar。谢谢指出
标签: python c cpython python-internals