Нет простого способа для стать другим объектом в python. Назначение self
не сделает этого; self
- это локальная переменная в определении метода, и ее присвоение никак не изменит существующий экземпляр; только сделать его недоступным для остальной части метода.
Есть несколько способов решения этой проблемы. Предпочтительным способом является наличие метода, который возвращает правильный экземпляр.
class Foo(...):
def get_or_save(self):
existing = load_from_database(self.bar)
if existing is not None:
return existing
else:
save_to_database(self)
return self
new_inst = Text()
new_inst.bar = "baz"
inst = new_inst.get_or_save()
# stop using new_inst
Существует также хакерский способ получить эффект, подобный вашему первоначальному примеру. Обычные классы Python хранят большинство своих атрибутов в специальном атрибуте __dict__
. Вы можете скопировать это, и будет, как будто один экземпляр заменяется другим. Конечно, это работает только для совершенно простых классов Python и может работать, а может и не работать с классами, определенными в ORM, или которые сохраняют состояние более умными способами.
class Foo(...):
def save(self):
existing = load_from_database(self.bar)
if existing is not None:
self.__dict__ = existing.__dict__
else:
save_to_database(self)