Преобразование экземпляра подкласса в экземпляр родительского класса

#python #class #object #inheritance

#python #класс #объект #наследование

Вопрос:

Допустим, у меня есть 2 класса A и B, где B наследуется от A. B переопределяет некоторые методы A и B, имеющие еще пару атрибутов. Как только я создал объект b типа B, возможно ли преобразовать его в тип A и только A? Это делается для получения примитивного поведения методов

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

1. Для такого преобразования нет встроенного универсального способа. Конечно, вы могли бы создать функцию или метод, который сконструировал an A из a B и вернул его.

Ответ №1:

Я не знаю, насколько это безопасно, но вы можете переназначить __class__ атрибут объекта.

 class A:
    def f(self):
        print("A")

class B(A):
    def f(self):
        print("B")

b = B()
b.f() # prints B
b.__class__ = A
b.f() # prints A
  

Это изменяет только класс объекта, он не обновляет ни один из атрибутов. В Python атрибуты добавляются к объектам динамически, и ничто не привязывает их к определенным классам, поэтому нет способа автоматически обновлять атрибуты при изменении класса.

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

1. Это предполагает, что все состояние экземпляра действительно имеет смысл для объекта типа точно A вместо B. Он не будет выполнять никаких исправлений атрибутов, которые могут потребоваться.

2. Интересно, означает ли это, что экземпляры не хранят явные ссылки на свои методы, а вместо этого используют это имя класса для последующего извлечения методов? Я думал, что нам придется сделать что-то подобное a = A.__new__(A) , a.__dict__ = b.__dict__ но это явно не такое уж странное решение. Я новичок, я должен прийти сюда, когда прочитаю заголовок вопроса.

3. Доступ к методам и статическим атрибутам осуществляется косвенно через класс.