Распаковка значений атрибутов экземпляра класса в значения атрибутов второго экземпляра при его инициализации
У меня есть два класса: One и Two. Первый имеет атрибуты aa, bb, второй - собственный атрибут cc и унаследованные от Two aa, bb соответственно.
Вопрос состоит в следующем: хочу иметь максимально экономичный способ при инициализации передавать в значения атрибутов экземпляра класса Two(two_inst в примере ниже) значения атрибутов уже существующего экземпляра класса One(one_inst в примере ниже). Другими словами, мне нужно при инициализации two_inst получить зачения(cc='cc', aa='aa', bb='bb'), но так, чтоб не руками aa, bb прописывать(и не в виде aa = one_inst.aa, bb=one_inst.bb), а как-то разом перекинуть эти значения от one_inst при инициализации two_inst.
О том, что это можно реализовать циклом в конструкторе класса Two, я догадываюсь. Меня больше интересует, есть ли какая-то возможность корректно разворачивать, например, словари со значениями атрибутов одного экземпляра при инициализации экземпляра дочернего ему класса - что-то типа передачи one_inst.__dict__ при инициализации two_inst, как на примере ниже
class One:
def __init__(self, aa, bb):
self.aa = aa
self.bb = bb
class Two(One):
def __init__(self, cc, *arg, **kw):
self.cc = cc
super().__init__(*arg, **kw)
one_inst = One(aa='aa', bb='bb')
two_inst = Two('cc', one_inst.__dict__) # я знаю что так это не работает (и не должно) - просто для демонстрации смысла того, что я хочу получить.
Ответы (2 шт):
Вы были близки.
two_inst = Two('cc', **one_inst.__dict__)
Стоит посмотреть: Что значит * (звёздочка) и ** двойная звёздочка в Питоне?
Рассмотрите вариант создания объекта с помощью конструктора
class A:
@classmethod
def create_related(cls, parent, *args, **kwargs):
child = cls(*args, parent.__dict__, **kwargs)
return child
class B(A):
pass
a = A()
b = B.create_related(a) # coздаст экземпляр "B"
# скопирует аттрибуты объекта из "a"