Мне было интересно, можно ли как-то модифицировать код Python вживую, сохраняя все состояние экземпляров объектов и методов, как я думаю, возможно в Lisp или Erlang (*)?
Скажем, у меня есть активные сеансы Python, где я создал экземпляр класса foo
из самонаписанного модуля:
class foo():
@classmethod
def do_something(self):
print "this is good"
Командная строка Python:
>>> f =foo()
>>> f.do_something()
Теперь я хотел бы изменить оператор печати на что-то другое (например, print "this is better"
). Если я отредактирую файл модуля, чтобы сделать это, и перезагрузите его, я должен повторно создать экземпляр объекта f
. Есть ли способ просто позвонить f.do_something()
снова, не вызывая сначала f=foo()
?
Итак, я должен это сделать:
>>> reload my_module
>>> f =foo()
>>> f.do_something() # with changed print statement
Но я хочу сделать это:
>>> reload my_module
>>> f.do_something() # with changed print statement
(*) Я основываю это утверждение на крутом фильме Erlang и этот фрагмент Практический общий Lisp: "Когда ошибка, проявленная в дикой природе - на 100 миллионов миль от Земли, команде удалось диагностировать и исправлять текущий код, позволяя завершить эксперименты.
Изменить: Я думал об этом немного больше, и, может быть, то, что я хочу, по своей сути ошибочно относится к применению OO (то есть к состоянию класса и методам). Я думаю, что Erlang позволяет это, потому что, насколько я помню, это больше касается отдельных коммуникационных объектов, поэтому живое обновление кода объекта имеет больше смысла. Я не уверен, хотя, так что все еще открыт для ответов.
Edit2: Возможно, лучший способ описать то, что я хочу, - это повторить то, что я сказал в комментарии в сообщении ниже: "Когда вызывается, методы просто должны указывать на новые определения методов/места".