【发布时间】:2015-02-27 11:55:37
【问题描述】:
我观察到类继承有一个奇怪的效果。对于我正在进行的项目,我正在创建一个类来充当另一个模块类的包装器。
我正在使用 3rd-party aeidon 模块(用于处理字幕文件),但问题可能不太具体。
这是您通常如何使用该模块...
project = aeidon.Project()
project.open_main(path)
这里是使用中的示例'wrapper'类(当然真实的类有很多方法):
class Wrapper(aeidon.Project):
pass
project = Wrapper()
project.open_main(path)
上述代码在执行时会引发 AttributeError。但是,以下工作符合我最初的预期:
junk = aeidon.Project()
project = Wrapper()
project.open_main(path)
我以远处的诡异动作命名这个问题,因为我怀疑它涉及环境中的全局变量/对象,但我不知道。
我最终使用组合来解决这个问题(即self.project = aeidon.Project()),但我仍然对此感到好奇。谁能解释这里发生了什么?
这是回溯:
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-5-fe548abd7ad0> in <module>()
----> 1 project.open_main(path)
/usr/lib/python3/dist-packages/aeidon/deco.py in wrapper(*args, **kwargs)
208 def wrapper(*args, **kwargs):
209 frozen = args[0].freeze_notify()
--> 210 try: return function(*args, **kwargs)
211 finally: args[0].thaw_notify(frozen)
212 return wrapper
/usr/lib/python3/dist-packages/aeidon/agents/open.py in open_main(self, path, encoding)
161 format = aeidon.util.detect_format(path, encoding)
162 self.main_file = aeidon.files.new(format, path, encoding)
--> 163 subtitles = self._read_file(self.main_file)
164 self.subtitles, sort_count = self._sort_subtitles(subtitles)
165 self.set_framerate(self.framerate, register=None)
/usr/lib/python3/dist-packages/aeidon/project.py in __getattr__(self, name)
116 return self._delegations[name]
117 except KeyError:
--> 118 raise AttributeError
119
120 def __init__(self, framerate=None, undo_limit=None):
AttributeError:
无论是否调用 Project 的 __init__(),我都试过了。显然这不是在正常情况下应该做的事情,我只是很困惑为什么 Wrapper() 只有在创建垃圾 aeidon.Project() 之后才能按预期运行。
【问题讨论】:
-
这可能特定于
aeidon项目,但我们无法确定,因为您没有包含完整的回溯。 -
ipython3 v2.3.1 但我也在 python3 v3.4.0 中测试过
标签: python inheritance multiple-inheritance