7

我正在尝试实现我自己的版本DailyLogFile

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)

但看起来我错过了 Python 子类化过程的基础......当我收到这个错误时:

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'

所以我需要显式地添加和定义其他方法,比如Write和这样的rotate方法:

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)

虽然我认为它会正确地从基母类继承。请注意,我什么都不做,只调用“超级”,

请有人可以解释为什么我的第一个想法是没有必要添加 Write 方法是错误的吗?

有没有办法在我的 NDailyLogFile 中对 Python 说它应该拥有所有不是直接从其母类定义的方法 DailyLogFile?这样它就可以防止这种错误之王 _sync(klass, klass.__dict__[methodName]并避免明确指定?

( DailyLogFile 的原始代码启发了我,它取自这里的扭曲源https://github.com/tzuryby/freespeech/blob/master/twisted/python/logfile.py

编辑:关于使用super,我得到:

  File "/home/lt/inwork/ndailylogfile.py", line 57, in write
    super.write(self, data)
exceptions.AttributeError: type object 'super' has no attribute 'write'

所以不会使用它。我的想法是正确的……我肯定错过了什么

4

2 回答 2

3

有一种解决方法,只需执行以下操作:

NDailyLogFile.__dict__ = dict( NDailyLogFile.__dict__.items() + DailyLogFile.__dict__.items() )
threadable.synchronize(NDailyLogFile)

这里有一个问题,您正在使用该类而没有实例化它。此解决方法有效,因为您在实例化之前强制更改类属性。

另一个重要的评论是,对于DailyLogFile命令的子类super将不起作用,因为DailyLogFile它是所谓的“旧样式类”或“classobj”。super仅适用于“新风格”课程的作品。有关此问题的更多信息,请参阅此问题

于 2013-06-12T20:50:39.177 回答
2

我敢说twisted/python/threadable.py代码中有一个错误。 __dict__只返回本地属性,而不是继承的属性。 其他 帖子说使用dir()inspect.getmembers()获取它们。

好消息是,您对write方法是继承的第一个想法是正确的。坏消息是 Twisted 不识别继承的方法,所以你必须自己编写它们。

于 2013-06-12T20:40:09.047 回答