У меня есть класс, содержащий ~ 20 методов, и в def __init__(self, ...):
мне нужно вызвать многие из этих методов (~ 9), но я не хотел вызывать каждый отдельный метод по одному.
Итак, я выбрал легкий путь и создал два списка со списками, которые используют exec
для вызова каждого метода:
[exec("self.create%s()" % x) for x in "ArticleObjects SeriesObjects ArticleList SearchList".split(" ")]
[exec("self.compile%sPage(self)" % x) for x in "About Screenshots Search Contact Articles".split(" ")]
Когда я запустил этот код с помощью python3 filename.py
, я получил ошибку,что читается:
NameError: name 'self' is not defined
Путем проб и ошибок я нашел это;чтобы заставить этот код работать, мне пришлось создать копию self
с именем instance
и сделать новую переменную instance
глобальной переменной, а затем вызвать метод, используя ClassName.methodName(instance)
вместо self.methodName()
:
С рабочим кодом:
global instance; instance = self
[exec("ClassNamecreate%s(instance)" % x) for x in "ArticleObjects SeriesObjects ArticleList SearchList".split(" ")]
[exec("ClassName.compile%sPage(instance)" % x) for x in "About Screenshots Search Contact Articles".split(" ")]
Почему это так?Почему переменная self
не определена в exec
, хотя она доступна для области, в которую вызывается exec
?
Обновление: Я использую Python 3.6.7