Я даже не уверен, возможно ли следующее. Мой вопрос легко описывается с помощью следующего кода:
Мой модуль определен как
asdf = 5
class MyClass:
def myfct(self):
return asdf
У меня есть модуль, который определяет сложный класс. Он использует определение модуля, в котором он находится. Здесь я называю его asdf
. На самом деле, asdf
само по себе является определением класса, для простоты у меня здесь просто есть целое число.
Я хочу удалить asdf
из модуля в качестве члена, но класс все еще есть Работа. Поэтому перед удалением из модуля я сначала записываю его в определение MyClass
динамически после загрузки модуля, затем удаляю его из модуля.
import mymodule
MyClass.asdf = asdf
del sys.modules['mymodule'].asdf
Наконец, я использую это для создания экземпляра нового класса
myobj = mymodule.MyClass()
myobj.myfct()
но, конечно, это выдает ошибку
NameError: имя 'asdf' не определено
Как сделать класс работать, не изменяя код класса, а именно, не изменяя return asdf
на return self.asdf
и все же удаляя asdf
из модуля (и не добавляя другие атрибуты модуля). Тем не менее, мне разрешено динамически изменять функцию после import mymodule
.
Имейте в виду, что определение функции очень сложное, поэтому что-то вроде ее повторной записи с exec
({ ссылка }) - это не вариант.
Одна из моих идей заключается в том, чтобы динамически изменять сигнатуру метода так, чтобы он получал необязательный аргумент asdf
. Таким образом, код внутри будет использовать эту переменную, но я не знаю, как это сделать. Возможно, полезными могут быть байтплей / метаклассы: