ich versuche, meine eigene Version eines DailyLogFile
Python: Warum eine Methode aus der Superklasse nicht gesehen?
from twisted.python.logfile import DailyLogFile
class NDailyLogFile(DailyLogFile):
def __init__(self, name, directory, rotateAfterN = 1, defaultMode=None):
DailyLogFile.__init__(self, name, directory, defaultMode) # why do not use super. here? lisibility maybe?
#
self.rotateAfterN = rotateAfterN
def shouldRotate(self):
"""Rotate when N days have passed since file creation"""
delta = datetime.date(*self.toDate()) - datetime.date(*self.toDate(self.createdOn))
return delta > datetime.timedelta(self.rotateAfterN)
def __getstate__(self):
state = BaseLogFile.__getstate__(self)
del state["rotateAfterN"]
return state
threadable.synchronize(NDailyLogFile)
zu implementieren, aber es sieht aus wie ich eine grundlegende Python Subklassifizieren Prozess verpassen ... wie ich diese Fehlermeldung erhalten:
Traceback (most recent call last):
File "/home/twistedtestproxy04.py", line 88, in <module>
import ndailylogfile
File "/home/ndailylogfile.py", line 56, in <module>
threadable.synchronize(NDailyLogFile)
File "/home/lt/mpv0/lib/python2.6/site-packages/twisted/python/threadable.py", line 71, in synchronize
sync = _sync(klass, klass.__dict__[methodName])
KeyError: 'write'
i so müssen explizit hinzufügen und andere Methoden wie Write
und rotate
Methode wie folgt definieren:
class NDailyLogFile(DailyLogFile):
[...]
def write(self, data): # why must i add these ?
DailyLogFile.write(self, data)
def rotate(self): # as we do nothing more than calling the method from the base class!
DailyLogFile.rotate(self)
threadable.synchronize(NDailyLogFile)
whi le ich dachte, dass es richtig von der Basismutterklasse erben würde. Beachten Sie, dass ich nichts tue, nur "super",
anrufen bitte kann jemand erklären, warum ich falsch bin auf meine erste Idee, dass es nicht notwendig war, die Write-Methode hinzuzufügen?
Gibt es eine Möglichkeit, zu Python in meinem NDailyLogFile zu sagen, dass es alle Methoden DailyLogFile haben sollte, die nicht direkt von seiner Mutterklasse definiert sind? So dass es diesen König von Fehler _sync(klass, klass.__dict__[methodName]
verhindert und das excipicitly vermeiden zu spezifizieren?
(Original-Code von DailyLogFile, die mir aus der verdrehten Quelle hier https://github.com/tzuryby/freespeech/blob/master/twisted/python/logfile.py genommen inspiriert)
EDIT: über die Verwendung von super
, erhalte ich:
File "/home/lt/inwork/ndailylogfile.py", line 57, in write
super.write(self, data)
exceptions.AttributeError: type object 'super' has no attribute 'write'
wird so nicht verwenden. Meine Gedanken waren, dass es richtig war ... ich muss definitiv etwas verpasst haben
Von OOP-Perspektive machen Sie es richtig, außer Sie wollen nicht alle Methoden überschreiben. Und du solltest wirklich 'super' benutzen. Das Problem ist, dass 'threadable.py' nicht sehr freundlich zu diesem OOP-Zeug ist, da die Zeile, die einen Fehler auslöst, auf das Vorhandensein von' write' in * dieser bestimmten Klasse * achtet, aber nicht auf ihre Vorfahren. Ich habe keine Erfahrung mit "verdreht", also weiß ich nicht, wie ich das überwinden kann. Vielleicht gibt es irgendwo im Internet irgendwelche Anleitungen? – J0HN
ok, danke für den Kommentar. Ich weiß nicht, ob es für jetzt eine bessere Antwort gibt. aber du hast einen guten Teil :) – user2468222
Ich denke, die alberne und wahrscheinlich falsche Art zu erreichen, was du versuchst zu tun, ist das Ersetzen von 'class .__ dict __ [methodName]' durch 'getattr (klass, methodname)' in 'threadable .py'. Und höchstwahrscheinlich wird es nicht funktionieren. Und es ist ein Patch zu verdreht. Und es bricht wahrscheinlich etwas außerhalb dieses speziellen Anwendungsfalls. Also, bitte versuchen Sie es als einen Beweis des Konzepts und wenn es wirklich funktioniert - schlagen Sie als ein Patch vor, der über angeschlagene Listen oder Ticketverfolger verdreht wird, oder was auch immer sie verwenden, um Entwicklung zu fördern. Und vergessen Sie nicht, hier etwas zu posten, damit ich weiß, ob es geholfen hat :) – J0HN