Приведи пример Наследования

Ответ

Ответ не найден

Ответ 18+ 🔞

А, ну вот, опять про этот ваш Python с его "множественным наследованием"! Слушай, я тебе как человек, который уже на этом подгорел, объясню. Это ж как в семье, где у ребёнка три отца — один учит драться, второй учит пить, а третий — философию читать. И бедный класс-ребёнок вообще нихуя не понимает, кого слушать.

Вот смотри, обычное наследование — это как у тебя отец один. Всё просто: взял от папки гены — и вперёд. А тут, ёпта, MRO (Method Resolution Order) включается. Это такой алгоритм, который решает, кого из "родителей" слушать в первую очередь, когда они все орут: "Сынок, метод super().some_method() вызывай!".

Ёперный театр, сейчас на примере. Допустим, у нас класс D наследуется от B и C, а те, в свою очередь, от A.

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

class B(A):
    def speak(self):
        print("B")
        super().speak()

class C(A):
    def speak(self):
        print("C")
        super().speak()

class D(B, C):
    def speak(self):
        print("D")
        super().speak()

Ты думаешь, тут бардак? А вот и нет! Python не мудак, он умный. Порядок вызовов определяется по C3 Linearization. Грубо говоря, он строит список приоритетов: [D, B, C, A, object].

Запустим:

d = D()
d.speak()

Выведет:

D
B
C
A

Ни хуя себе, да? Всё чётко и по плану! Сначала D крикнул своё, потом по цепочке MRO пошло: B, потом C, и только в конце общий предок A. Главное — все super() должны быть на месте, иначе цепочка порвётся, и будет тишина, доверия ебать ноль к таким классам.

А теперь хитрая жопа начинается, когда порядок наследования меняешь. Объяви class D(C, B) — и всё, приехали. Порядок станет [D, C, B, A, object], и вызов пойдёт через C первым. Это надо держать в голове, а то сам от себя охуеешь, когда программа поведёт себя не так, как ожидал.

Короче, множественное наследование — пиздопроебибна штука мощная, но опасная. Как цепная пила: можно быстро лес валить, а можно и ногу отпилить, если не понимаешь, как она работает. Э, бошка, думай, когда используешь! И всегда смотри Class.__mro__, чтобы понять, кто за кем идёт. И тогда, может, и не накроется твой проект медным тазом.