【问题标题】:Python OOP Question. Overriding a method when creating a new objectPython OOP 问题。创建新对象时覆盖方法
【发布时间】:2023-01-11 07:11:41
【问题描述】:

我正在使用 Watchdog library 来监控不同的文件夹。有两个文件夹具有两种不同的行为:

在文件夹 alpha 中,当创建新文件时,将其移动到 destination_alpha。 在文件夹 beta 中,当创建一个新文件时,将其传递给一个方法。

这是第一个行为的代码 sn-p:

import shutil
from watchdog.events import FileSystemHandler
from watchdog.observers import Observer

class FolderWatcher(FileSystemEventHandlder):
    '''Overrides the on_created method to take action when a file is created.'''
    def on_created(self, event):
        shutil.move(event.src_path, '/destination_alpha')
event_handler = FolderWatcher()
folder_alpha_observer = Observer()
folder_alpha_observer.schedule(event_handler,'/folder_alpha')
try:
    while True:
    time.sleep(1)
finally: 
    folder_alpha_observer.stop()
    folder_alpha_observer.join()

我可以在 on_created 方法中为另一个具有不同行为的 FolderWatcher 对象重用同一个类吗?或者我是否需要使用不同的 on_created 方法创建一个新的 FolderWatcher-ish 类?

class SecondFolderWatcher(FileSystemEventHandlder):
    '''Overrides the on_created method to take action when a file is created.'''
    def on_created(self, event):
        imported_method(event.src_path)
second_folder_watcher = SecondFolderWatcher()
folder_beta_observer = Observer()
folder_beta_observer.schedule(second_folder_watcher,'/folder_alpha')
try:
    while True:
    time.sleep(1)
finally: 
    folder_alpha_observer.stop()
    folder_alpha_observer.join()

这看起来不是很优雅,为我想要执行的每个 on_created 操作创建一个全新的类。但我没有看到更好的方法。你的想法?

【问题讨论】:

    标签: python inheritance overriding


    【解决方案1】:

    你总是可以注入一个回调函数:

    class FolderWatcher(FileSystemEventHandlder):
        '''Overrides the on_created method to take action when a file is created.'''
        def __init__(self, on_created_cb):
            super().__init__()
            self._on_created_cb = on_created_cb
    
        def on_created(self, event):
            self._on_created_cb(event)
    
    event_handler = FolderWatcher(
        lambda event: shutil.move(event.src_path, '/destination_alpha')
    )
    second_folder_watcher = FolderWatcher(
        lambda event: imported_method(event.src_path)
    )
    # etc
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-06
      • 1970-01-01
      • 2011-02-24
      • 2017-04-26
      • 2018-01-07
      • 1970-01-01
      相关资源
      最近更新 更多