#python #class #object #inheritance
#python #класс #объект #наследование
Вопрос:
Допустим, у меня есть 2 класса A и B, где B наследуется от A. B переопределяет некоторые методы A и B, имеющие еще пару атрибутов. Как только я создал объект b типа B, возможно ли преобразовать его в тип A и только A? Это делается для получения примитивного поведения методов
Комментарии:
1. Для такого преобразования нет встроенного универсального способа. Конечно, вы могли бы создать функцию или метод, который сконструировал an
A
из aB
и вернул его.
Ответ №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. Доступ к методам и статическим атрибутам осуществляется косвенно через класс.