Я наблюдал странный эффект с наследованием класса. Для проекта, над которым я работаю, я создаю класс для работы в качестве оболочки для класса другого модуля.Наследование класса Python - призрачное действие
Я использую сторонний модуль aeidon (используется для управления файлами субтитров), но проблема, вероятно, менее конкретна.
Вот как вы обычно используете модуль ...
project = aeidon.Project()
project.open_main(path)
Вот «обертка» класс примера использования (конечно, реальный класс имеет множество методов):
class Wrapper(aeidon.Project):
pass
project = Wrapper()
project.open_main(path)
Этот вышеупомянутый код вызывает AttributeError после выполнения. Однако следующие работы, как я изначально ожидали, что это:
junk = aeidon.Project()
project = Wrapper()
project.open_main(path)
Я назвал этот вопрос после жутких действий на расстояние, потому что я подозреваю, что она включает в себя глобальные VARS/объекты в окружающей среде, но я не знаю.
В итоге я использовал композицию для решения этой проблемы (то есть 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:
Я пробовал так и без вызова принадлежность проекта __init__()
. Очевидно, что это не совсем то, что нужно делать при нормальных обстоятельствах, я просто недоумеваю, почему Wrapper() будет функционировать так, как ожидалось, только после создания нежелательной aeidon.Project().
Это, вероятно, относится к проекту 'aeidon', но мы не можем сказать, потому что вы не включили полную трассировку. –
ipython3 v2.3.1, но я также тестировал его в python3 v3.4.0 – Six