gpt4 book ai didi

python : why a method from super class not seen?

转载 作者:太空狗 更新时间:2023-10-29 21:50:18 25 4
gpt4 key购买 nike

我正在尝试实现我自己的 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'

所以我需要显式添加和定义其他方法,例如 Writerotate 方法,如下所示:

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)

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

请有人解释为什么我的第一个想法是错误的,即没有必要添加 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'

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

最佳答案

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

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

这里有一个问题,你在没有实例化的情况下使用类。此解决方法有效,因为您在实例化之前强制更改类属性。

另一个重要的评论是,对于 DailyLogFile 的子类,命令 super 将不起作用,因为 DailyLogFile 是所谓的“旧样式”类”,或“classobj”。 super 仅适用于“新样式”类。 See this question for further information about this .

关于 python : why a method from super class not seen?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17074330/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com