← Назад к вопросам

Можно ли у дочернего класса узнать родительский класс в Python?

1.2 Junior🔥 111 комментариев
#Python Core

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Получение родительского класса в Python

Да, в Python существует несколько способов получить ссылку на родительский класс из дочернего класса. Это полезно при необходимости вызова методов родителя или получения информации о наследовании.

Способ 1: Использование __bases__ и __mro__

Атрибут __bases__ содержит кортеж непосредственных родительских классов:

class Parent:
    pass

class Child(Parent):
    pass

print(Child.__bases__)  # (<class __main__.Parent>,)
print(Child.__mro__)    # (<class __main__.Child>, <class __main__.Parent>, <class object>)

Атрибут __mro__ (Method Resolution Order) показывает полную цепочку наследования в порядке разрешения методов.

Способ 2: Функция super()

Это современный и рекомендуемый подход для работы с родительским классом:

class Parent:
    def greet(self):
        return "Hello from Parent"

class Child(Parent):
    def greet(self):
        parent_greeting = super().greet()
        return f"{parent_greeting} and Child"

child = Child()
print(child.greet())  # Hello from Parent and Child

super() автоматически определяет родительский класс на основе MRO, что делает код более гибким и поддерживаемым.

Способ 3: Прямое обращение к имени класса

В простых случаях можно явно указать имя родительского класса:

class Parent:
    def method(self):
        return "parent"

class Child(Parent):
    def method(self):
        result = Parent.method(self)
        return f"{result} + child"

Однако этот подход менее гибкий и может вызвать проблемы при множественном наследовании.

Способ 4: Множественное наследование

При множественном наследовании __bases__ вернёт все прямые родители:

class A:
    pass

class B:
    pass

class C(A, B):
    pass

print(C.__bases__)  # (<class __main__.A>, <class __main__.B>)

Получение родителя из экземпляра

Чтобы получить родительский класс из объекта, используйте:

class Parent:
    pass

class Child(Parent):
    pass

obj = Child()
parent_class = obj.__class__.__bases__[0]
print(parent_class)  # <class __main__.Parent>

Лучшие практики

  • Используйте super() для вызова методов родителя — это самый Pythonic способ
  • Проверяйте наследование с помощью issubclass() и isinstance()
  • Избегайте явных ссылок на имена родительских классов в коде — это нарушает DRY принцип
  • При множественном наследовании всегда проверяйте MRO через __mro__ или метод mro()
# Проверка наследования
print(issubclass(Child, Parent))  # True
print(isinstance(child_obj, Parent))  # True

Эти методы позволяют эффективно работать с иерархией классов и делают код более гибким и поддерживаемым.