Приведение к другому классу в Python

#python #inheritance

#python #наследование

Вопрос:

У меня есть код (упрощенный):

 class A(object):
    attrib1 = "a"
    attrib2 = "b"

class B(A):
    flag = True
  

в каком-то месте моего кода у меня есть экземпляр A, но мне нужно создать экземпляр класса B, который будет содержать все данные из экземпляра A… Я чувствую себя глупо, но я не хочу делать что-то вроде:

 class B(A):
    def __init__(self,a1,a2,a3,a4,..):
        self.a1 = a1
        self.a2 = a2
  

и вызываем как:

 obj_b = B( obj_a.a1, obj_a.a2,...)
  

Ответ №1:

 class B(A):
    def __init__(self, obj):
        self.__dict__.update(obj.__dict__)
  

Комментарии:

1. Обратите внимание, что это, как правило, плохая идея. Проверьте тип obj и скопируйте только те атрибуты, которые имеют значение.

2. На данный момент это решит проблему, и я решу проблему, как только она возникнет, но спасибо за предупреждение.

3. __dict__ может быть недоступен, и он прерывается, если вы используете property … Кроме того, некоторые данные могут быть определены в классе, поэтому они не будут находиться внутри obj.__dict__

Ответ №2:

Другой вариант — изменить __class__ переменную в вашем экземпляре A.

 a = A()
a.__class__ = B