Я пытаюсь реализовать динамическую перезагрузку объектов в Python, которые отражают изменения кода в реальном времени.
Перезагрузка модулей работает, но мне нужно заново создавать каждый экземпляр классов модулей, чтобы изменения вступили в силу.
Проблема в том, что данные объектов (объекты __dict__
содержимое) теряются во время процесса.
Итак, я попробовал другой подход:
def refresh(obj, memo=None):
if memo is None:
memo = {}
d = id(obj)
if d in memo:
return
memo[d] = None
try:
obj.__class__ = getattr(sys.modules[obj.__class__.__module__],
obj.__class__.__name__)
except TypeError:
return
for item in obj.__dict__.itervalues():
if isinstance(item, dict):
for k, v in item.iteritems():
refresh(k, memo)
refresh(v, memo)
elif isinstance(item, (list, tuple)):
for v in item:
refresh(v, memo)
else:
refresh(item, memo)
И на удивление это работает! После вызова метода refresh () для моих объектов новый код вступает в силу, без необходимости его повторного создания.
Но я не уверен, что это правильный путь для прохождения объекта? Есть ли лучший способ пройти компоненты объекта?