Python中Watchdog调度self无响应问题:self是否等价Java的this?
问题描述
我尝试运行一段Watchdog代码,示例代码如下:
import time from watchdog.observers import Observer from watchdog.events import LoggingEventHandler from watchdog.events import FileSystemEventHandler class FileDispatcherTask (FileSystemEventHandler): def __init__ (self, src, dest, queue): self._src = src self._dest = dest self._queue = queue; def dispatch (self, file): info = JobInfo(file) self._queue.addJob(info) def on_created (self, event): print ("File was created") print (event) async def run (self): observer = Observer() observer.schedule(self, self._src, recursive=False) observer.start() try: while True: time.sleep(1) finally: observer.stop() observer.join()
这段代码需要作为任务运行,在run方法中配置Observer,但调用schedule方法传入self后,无法输出文件创建的相关信息。若将事件监听逻辑单独编写为一个类则可正常工作。我忽略了什么?Python的self关键字是否与Java的this类似?
问题分析与解决
1. 核心问题:重写dispatch方法导致事件分发中断
你在FileDispatcherTask里自定义的dispatch方法覆盖了FileSystemEventHandler的内置dispatch方法——这个父类方法的核心作用是接收文件系统事件,根据事件类型(创建、修改、删除等)自动调用对应的on_*回调(比如你的on_created)。
自定义的dispatch完全替代了父类逻辑,导致Watchdog无法把事件传递到on_created,自然不会输出任何信息。
解决方式二选一:
- 直接删除你自定义的
dispatch方法,让父类的dispatch正常工作; - 如果需要保留业务逻辑,在自定义
dispatch里调用父类实现,同时修正参数名(父类dispatch的参数是event而非file):
def dispatch(self, event): # 你的业务逻辑 info = JobInfo(event.src_path) self._queue.addJob(info) # 调用父方法,确保事件能分发到on_created super().dispatch(event)
2. Python的self与Java的this对比
两者核心作用一致:都指代当前类的实例对象,用于访问实例属性和方法。但细节有差异:
- Python的
self必须显式写在方法参数列表的第一个位置,Java的this是隐式存在的,无需在参数中声明; - Python允许给
self换其他名字(比如me),但行业通用惯例是self;Java的this是关键字,不能替换; - 构造方法中,Python用
__init__通过self.xxx赋值属性,Java用类名作为构造方法,通过this.xxx赋值。
你的代码里self的使用没有问题,故障根源不在self上。
内容的提问来源于stack exchange,提问作者Code4Fun
相关产品推荐
相关产品推荐

