如果您担心回调会使实例保持活动状态,那么
不要传入绑定方法
.
self.BgError
创建方法对象(通过
descriptor protocol
,它引用实例对象,因为在调用该实例时它需要访问该实例;这就是
self
首先传入参数。
如果不需要引用实例状态,并且回调API可以处理未绑定的方法、类方法或静态方法,则将其中一个方法传入。
例如,您可以
BgError
类方法或静态方法:
@classmethod
def BgError(cls):
# ...
现在两个
Client.BgError
和
自错
(
instance_of_Client.BgError
)生成绑定到类而不是实例的方法对象,从而提供一致的行为。没有对实例进行额外的引用。
如果您确实需要实例状态,请使用
weak reference
以你为例。调用时,请在使用实例之前检查弱引用是否仍然可用。也看到
using python WeakSet to enable a callback functionality
有关回调和弱引用的更深入的帖子。在那里,回调注册表负责生成和存储弱引用,但同样的原则也适用。