Распаковка значений атрибутов экземпляра класса в значения атрибутов второго экземпляра при его инициализации

У меня есть два класса: 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 шт):

Автор решения: Tihon

Рассмотрите вариант создания объекта с помощью конструктора

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"
→ Ссылка