试试写一个handler弱引用的工具类
时间: 2023-11-28 18:50:10 浏览: 54
GoTools:我自己的go 工具类, 把一些便捷的小功能都做在这个项目,方便引用
好的,这里是一个基于Python的弱引用工具类:
```python
import weakref
class WeakMethod:
def __init__(self, method):
self.method = None
self.set_method(method)
def set_method(self, method):
if method is None:
self.method = None
return
if not callable(method):
raise TypeError("Expected a callable")
self.method = weakref.ref(method)
def __call__(self, *args, **kwargs):
if self.method is None:
raise TypeError("Method is None")
method = self.method()
if method is None:
raise TypeError("Method is None")
return method(*args, **kwargs)
class WeakHandler:
def __init__(self, handler):
if not callable(handler):
raise TypeError("Expected a callable")
self.handler = weakref.ref(handler)
def __call__(self, *args, **kwargs):
handler = self.handler()
if handler is None:
return None
return handler(*args, **kwargs)
def clear(self):
self.handler = None
```
这个工具类包括两个类:`WeakMethod` 和 `WeakHandler`。其中,`WeakMethod` 是用来存储一个弱引用的方法,而 `WeakHandler` 则是用来存储一个弱引用的回调函数。
使用这个工具类非常简单,只需要在需要存储回调函数的地方创建一个 `WeakHandler` 对象即可:
```python
def on_event(self, event):
pass
weak_handler = WeakHandler(self.on_event)
```
这样,`weak_handler` 对象就会存储一个弱引用的 `on_event` 方法。当需要调用回调函数时,只需要调用 `weak_handler` 对象即可:
```python
event = ...
result = weak_handler(event)
```
如果 `on_event` 方法已经被销毁,那么 `weak_handler` 对象调用时会返回 `None`。如果需要清除 `WeakHandler` 对象中的弱引用,可以调用 `clear()` 方法:
```python
weak_handler.clear()
```
阅读全文