Мне было интересно, можно ли каким-то образом изменить код Python вживую, сохраняя при этом все состояния экземпляров объектов и методов, например, я думаю, что возможно в Lisp или Erlang (*)?
Скажем, у меня есть активные сеансы Python, в которых я создал экземпляр foo
класс из самописного модуля:
class foo():
@classmethod
def do_something(self):
print "this is good"
Командная строка Python:
>>> f =foo()
>>> f.do_something()
Теперь я хотел бы изменить оператор печати на что-нибудь другое (например, print «это лучше»
). Если я отредактирую свой файл модуля для этого и перезагружу его, мне придется повторно создать экземпляр объекта 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 и на этом фрагменте из Practical Common Lisp : ' Когда ошибка проявляется в дикой природе - 100 в миллионах миль от Земли - команда смогла диагностировать и исправить работающий код , что позволило завершить эксперименты. '
Edit: Я немного подумал подробнее об этом и, возможно, то, что я хочу, по своей сути несовершенно для применения к объектно-ориентированному программированию (то есть, как насчет состояния класса и методов). Я думаю, что Erlang позволяет это, потому что, насколько я помню, это больше касается отдельных взаимодействующих объектов, поэтому обновление кода объекта в реальном времени имеет больше смысла. Я не уверен, поэтому все еще открыт для ответов.
Edit2:
obj12 [объект Объект]
сообщение pr1
pr2 беспорядок
Однако как выполнить итерацию внутренних объектов ( obj1, obj2
) и их собственных свойств ( prop1, prop2
)?