Python, как преобразовать существующий объект родительского класса в объект дочернего класса - PullRequest
1 голос
/ 30 марта 2020

*** Чтобы объяснить, почему я хочу сделать следующее, я пытаюсь обернуть сторонний инструмент и сделать больше с ним.

Я использую сторонний инструмент, в результате он возвращает объект. (например, объект класса Person, который содержит MANY атрибутов).

Я хочу объявить новый класс, например Driver(Person). Которые содержат все, что есть в Person классе и многое другое. Я НЕ РАЗРЕШЕН на изменение класса Person.

У меня уже есть существующий объект Person (возвращенный из стороннего инструмента), как мне преобразовать его в объект Driver? Не инициализируя новый пустой объект Driver и копируя все по одному в него, пожалуйста ... В моем случае, в классе Person более 30 атрибутов и свойств, и класс Person - не единственный класс, который мне нужен для этого. с. Я должен сделать это с около 20 классов. Вот почему для меня не практично копировать с нуля по одному для каждого класса, если нет другого пути.

class Person:
    def __init__(self):
        self._name = None

    @property
    def name(self):
        return self._name


class Driver(Person):
    def __init__(self):
        super().__init__()
        self._gender = None

    @property
    def gender(self):
        return self._gender

    def __str__(self):
        return f'{self.name} {self.gender}'

Учитывая экземпляр Person, приведите его к Driver. но представьте, что в обоих классах намного больше атрибутов. В настоящее время я просто загрузил экземпляр Person в новый экземпляр Driver в качестве атрибута. Но я думаю, что должен быть разумный способ сделать это.

1 Ответ

1 голос
/ 30 марта 2020

В основном все атрибуты класса живут внутри атрибута magi c __dict__. Этот словарь-подобный объект содержит все атрибуты, определенные для самого объекта.

Таким образом, способ скопировать сразу все атрибутов состоит в том, чтобы скопировать атрибут __dict__ из класса в другой. либо внутри метода, либо из экземпляра, подобного этому:

a = Person()
b = Driver()
b.__dict__.update(a.__dict__)

Обратите внимание, что при наличии повторяющихся атрибутов они будут перезаписаны, поэтому будьте осторожны

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...