2017-09-24 2 views
0

Ich verwendete dieses http://brunorocha.org/python/watching-a-directory-for-file-changes-with-python.html Beispiel für die Lösung dieser Aufgabe. Und es hat funktioniert. Wenn ich OOP nicht benutzt habe. Nun, ich versuche, meinen Code zu OOP neu zu schreiben, was ich tat: ich erstellte Datei mit dem Namen MyHandler.pyDas Überwachen eines Verzeichnisses für Dateiänderungen mit Python funktioniert nicht

#!/usr/bin/python3 
# -*- coding: utf-8 -*- 

import sys 

from watchdog.events import PatternMatchingEventHandler 

class MyHandler(PatternMatchingEventHandler): 
    patterns = ["*.xml", "*.lxml"] 

    def __init__(self, logger, myfunction): 
     self.logger = logger 
     self.myfunction = myfunction 

    def process(self, event): 
     """ 
     event.event_type 
      'modified' | 'created' | 'moved' | 'deleted' 
     event.is_directory 
      True | False 
     event.src_path 
      path/to/observed/file 
     """ 
     self.logger.debug("target: {} was {}".format(event.src_path, event.event_type)) 
     self.myfunction() 

    def on_created(self, event): 
     self.process(event) 

Als nächstes ich dies in meiner anderen Datei nenne, wo ich Funktion zum Lesen von xml:

observer = Observer() 
observer.schedule(MyHandler(self.logger, self.read_xml), path=self.mydir) 
observer.start() 

try: 
    while True: 
     time.sleep(1) 
except KeyboardInterrupt: 
    observer.stop() 

observer.join() 

Und, wenn ich versuche, dies zu nennen, ich habe:

AttributeError: 'MyHandler' object has no attribute '_ignore_directories' 

Wo lese ich Fehler haben? Vor meinen Experimenten mit OOP hatte ich:

Und es hat funktioniert. Jetzt funktioniert mein Skript nicht. Bitte helfen Sie.

Antwort

0

Sie rufen nicht die übergeordnete (PatternMatchingEventHandler) Objektkonstruktor

def __init__(self, logger, myfunction): 
    super().__init__() # <--- Put arguments to PatternMatchingEventHandler if constructor here if needed 
    self.logger = logger 
    self.myfunction = myfunction 

Der Konstruktor muss aufgerufen werden, um einige der Instanzvariablen für die übergeordnete Klasse wie _ignore_directories erforderlich einzurichten.

Verwandte Themen