You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 19:12:29