如果对对象的引用递增/递减,则覆盖哪个函数



我对Python有一个非常基本的疑问。当一个对象的ref计数增加时,是否有一个函数被调用?

我确信应该有一个双下划线方法,我可以在类中重写它。基本上,我在Foo类中寻找一个ref方法。

class Foo():
def __ref__(self):
print ("refcount increased by 1")
ref1 = Foo()
ref2 = ref1 # prints "refcount increased by 1"
ref3 = ref2 # prints "refcount increased by 1"

附言:我知道sys.getrefcount

没有这样的钩子。它会破坏所有类型的东西,包括依赖于在不触发解释代码的情况下增加对象的能力的C级代码。它与未被引用的Python实现(大多数都是这样(不兼容。它将与任何假设的未来未被引用的CPython实现不兼容(不太可能(。它与本身不兼容,因为仅仅调用或离开这样一个方法的行为就会改变对象的refcount,要求它无限地再次触发,并且在方法内部对对象执行任何操作也会修改refcount并导致另一个触发,即使你可以到达方法体。

VM没有调用用于引用计数的特殊方法。引用计数是CPython VM的一个实现细节,在特定于实现的帮助程序之外不可见。

引用计数(Python词汇表(

对对象的引用数。当对象降为零,则解除分配参考计数Python代码通常不可见,但它是CPython实现。sys模块定义一个getrefcount()函数,程序员可以调用该函数来返回特定对象。


CPython内部使用C宏/函数来管理引用计数。对于CPython 3.8,引用计数是一个C整数,省略调试操作引用计数定义为:

static inline void _Py_INCREF(PyObject *op)
{
op->ob_refcnt++;
}

获取引用只会增加引用计数。这纯粹是一个C增量操作,当增加引用计数时,不能调用任何Python代码。

// omitting lineno/filename used for debug
static inline void _Py_DECREF(PyObject *op)
{
_Py_DEC_REFTOTAL;
if (--op->ob_refcnt != 0) {
}
else {
_Py_Dealloc(op);
}
}

释放引用会减少引用计数,并立即触发未引用对象的取消分配。递减纯粹是一个C递减操作,当减少引用计数时,不能调用任何Python代码。只有在将引用计数减为0之后,_Py_Dealloc才能最终通过__del__调用Python代码。

最新更新