Как упоминает jonrsharpe, это:
mapping_dict = self.__dict__
не создает копию self.__dict__
- он только привязывает локальное имя mapping_dict
к объекту, также связанному с self.__dict__
(вы определенно хотите прочитайте это для получения дополнительной информации об именах / привязках Python и т. д.).
Итак, следующая строка:
mapping_dict['component'] = self.component.__dict__
фактически эквивалентна:
self.component = self.component.__dict__
, что явно не то, что вы хотите.
Простое решение - создать новый dict из self.__dict__
.Поскольку это необходимо как для Component
, так и для Entity
, лучшее решение состоит в том, чтобы выделить это для класса mixin :
class AsDictMixin(object):
def as_dict(self):
return {
k:(v.as_dict() if isinstance(v, AsDictMixin) else v)
for k, v in self.__dict__.items()
}
class Component(AsDictMixin):
def __init___(self, a, b):
self.a = a
self.b = b
class Entity(AsDictMixin):
def __init__(self, component, c, d):
self.component= component
self.c = c
self.d = d
Обратите внимание, что для этого не потребуется вычислениеатрибуты (свойства и т. д.) в учетной записи, только простые атрибуты экземпляра, но я предполагаю, что это то, что вы хотите.