logo

Python super()

У Python функція super() використовується для посилання на батьківський клас або суперклас. Це дозволяє викликати методи, визначені в суперкласі, з підкласу, дозволяючи розширювати та налаштовувати функціональні можливості, успадковані від батьківського класу.

Синтаксис super() у Python

Синтаксис: супер()



Повернення: Повертає проксі-об’єкт, який представляє батьківський клас.

функція super() у прикладі Python

У наведеному прикладі The Емп клас має __гарячий__ метод, який ініціалізує id , і назва і Додає атрибути. The позаштатний клас успадковує від Емп клас і додає додатковий атрибут під назвою електронні листи. Він викликає метод __init__ батьківського класу super(), щоб ініціалізувати успадкований атрибут.

Python3








class> Emp():> >def> __init__(>self>,>id>, name, Add):> >self>.>id> => id> >self>.name>=> name> >self>.Add>=> Add> # Class freelancer inherits EMP> class> Freelance(Emp):> >def> __init__(>self>,>id>, name, Add, Emails):> >super>().__init__(>id>, name, Add)> >self>.Emails>=> Emails> Emp_1>=> Freelance(>103>,>'Suraj kr gupta'>,>'Noida'> ,>'KKK@gmails'>)> print>(>'The ID is:'>, Emp_1.>id>)> print>(>'The Name is:'>, Emp_1.name)> print>(>'The Address is:'>, Emp_1.Add)> print>(>'The Emails is:'>, Emp_1.Emails)>

>

>

Вихід:

The ID is: 103 The Name is: Suraj kr gupta The Address is: Noida The Emails is: KKK@gmails>

Для чого використовується метод super ()?

Метод із батьківського класу можна викликати в Python за допомогою функції super(). Це типова практика в об'єктно-орієнтоване програмування для виклику методів суперкласу та увімкнення перевизначення та успадкування методів. Навіть якщо поточний клас замінив ці методи власною реалізацією, виклик super() дозволяє отримати доступ до методів батьківського класу та використовувати їх. Роблячи це, ви можете вдосконалювати та змінювати поведінку батьківського класу, водночас одержуючи від цього користь.

Переваги функції Super

  • Щоб отримати доступ до його методів, не потрібно запам'ятовувати або вказувати назву батьківського класу. Цю функцію можна використовувати як в одному, так і в множинному успадкуванні.
  • Це реалізує модульність (ізолюючі зміни) і можливість повторного використання коду, оскільки немає необхідності переписувати всю функцію.
  • Суперфункція в Python викликається динамічно, оскільки Python є динамічною мовою, на відміну від інших мов.

Як працює Inheritance без Python super?

У наведеному прикладі є проблема з методом __init__ класу Emp. Клас Emp успадковано від класу Person, але в його методі __init__ він не викликає метод __init__ батьківського класу для ініціалізації атрибутів імені та id.

Python3




# code> class> Person:> ># Constructor> >def> __init__(>self>, name,>id>):> >self>.name>=> name> >self>.>id> => id> ># To check if this person is an employee> >def> Display(>self>):> >print>(>self>.name,>self>.>id>)> > class> Emp(Person):> > >def> __init__(>self>, name,>id>):> >self>.name_>=> name> >def> Print>(>self>):> >print>(>'Emp class called'>)> Emp_details>=> Emp(>'Mayank'>,>103>)> # calling parent class function> Emp_details.name_, Emp_details.name>

багаторядковий коментар Powershell

>

>

Вихід:

--------------------------------------------------------------------------- AttributeError Traceback (most recent call last) in 24 25 # calling parent class function --->26 Emp_details.name_, Emp_details.name AttributeError: об’єкт 'Emp' не має атрибута 'name'>

Виправлення зазначеної вище проблеми за допомогою Super у Python

У наданому коді клас Emp правильно успадковує клас Person, а метод __init__ класу Emp тепер правильно викликає метод __init__ батьківського класу за допомогою super() у Python.

Python3




# code> # A Python program to demonstrate inheritance> class> Person:> ># Constructor> >def> __init__(>self>, name,>id>):> >self>.name>=> name> >self>.>id> => id> ># To check if this person is an employee> >def> Display(>self>):> >print>(>self>.name,>self>.>id>)> > class> Emp(Person):> > >def> __init__(>self>, name,>id>):> >self>.name_>=> name> >super>().__init__(name,>id>)> >def> Print>(>self>):> >print>(>'Emp class called'>)> Emp_details>=> Emp(>'Mayank'>,>103>)> # calling parent class function> print>(Emp_details.name_, Emp_details.name)>

>

>

Вихід:

Mayank Mayank>

Розуміння Python super() з методами __init__().

Python має зарезервований метод під назвою __init__. В об'єктно-орієнтованому програмуванні він називається конструктором. Коли цей метод викликається, він дозволяє класу ініціалізувати атрибути класу. У успадкованому підкласі на батьківський клас можна посилатися за допомогою функції super(). Функція super повертає тимчасовий об’єкт суперкласу, який надає доступ до всіх методів дочірнього класу.

Примітка: Для отримання додаткової інформації див Спадкування в Python .

Супер функція з єдиним успадкуванням

Візьмемо приклад тварин. Собаки, коти, корови є частиною тварин. Вони також мають такі спільні характеристики, як:

  • Вони є ссавцями.
  • У них є хвіст і чотири ноги.
  • Вони домашні тварини.

Отже, класи собак, котів і коней є підкласом класу тварин. Це приклад єдиного успадкування, оскільки багато підкласів успадковано від одного батьківського класу.

Python3




# Python program to demonstrate> # super function> class> Animals:> ># Initializing constructor> >def> __init__(>self>):> >self>.legs>=> 4> >self>.domestic>=> True> >self>.tail>=> True> >self>.mammals>=> True> >def> isMammal(>self>):> >if> self>.mammals:> >print>(>'It is a mammal.'>)> >def> isDomestic(>self>):> >if> self>.domestic:> >print>(>'It is a domestic animal.'>)> class> Dogs(Animals):> >def> __init__(>self>):> >super>().__init__()> >def> isMammal(>self>):> >super>().isMammal()> class> Horses(Animals):> >def> __init__(>self>):> >super>().__init__()> >def> hasTailandLegs(>self>):> >if> self>.tail>and> self>.legs>=>=> 4>:> >print>(>'Has legs and tail'>)> # Driver code> Tom>=> Dogs()> Tom.isMammal()> Bruno>=> Horses()> Bruno.hasTailandLegs()>

>

>

Вихід:

It is a mammal. Has legs and tail>

Супер із множинним успадкуванням

Візьмемо інший приклад суперфункції , Припустимо клас може літати і вміє плавати успадковуються від класу ссавців, і ці класи успадковуються класом тварин. Отже, клас тварин успадковує кілька базових класів. Давайте подивимося на використання Python супер з аргументами в цьому випадку.

parseint java

Python3




class> Mammal():> >def> __init__(>self>, name):> >print>(name,>'Is a mammal'>)> class> canFly(Mammal):> >def> __init__(>self>, canFly_name):> >print>(canFly_name,>'cannot fly'>)> ># Calling Parent class> ># Constructor> >super>().__init__(canFly_name)> class> canSwim(Mammal):> >def> __init__(>self>, canSwim_name):> >print>(canSwim_name,>'cannot swim'>)> >super>().__init__(canSwim_name)> class> Animal(canFly, canSwim):> >def> __init__(>self>, name):> >super>().__init__(name)> # Driver Code> Carol>=> Animal(>'Dog'>)>

>

>

Вихід:

Клас Animal успадковує від двох батьківських класів – canFly і canSwim. Отже, екземпляр підкласу Carol може отримати доступ до обох конструкторів батьківського класу.

Dog cannot fly Dog cannot swim Dog Is a mammal>

Супер з багаторівневим успадкуванням

Візьмемо інший приклад суперфункції , припустимо, що клас вміє плавати успадковано від canFly, canFly від класу ссавців. Отже, клас ссавців успадковує багаторівневу спадковість. Давайте подивимося на використання Python супер з аргументами в цьому випадку.

Python3


int до рядка в java



class> Mammal():> >def> __init__(>self>, name):> >print>(name,>'Is a mammal'>)> class> canFly(Mammal):> >def> __init__(>self>, canFly_name):> >print>(canFly_name,>'cannot fly'>)> ># Calling Parent class> ># Constructor> >super>().__init__(canFly_name)> class> canSwim(canFly):> >def> __init__(>self>, canSwim_name):> >print>(canSwim_name,>'cannot swim'>)> >super>().__init__(canSwim_name)> class> Animal(canSwim):> >def> __init__(>self>, name):> ># Calling the constructor> ># of both the parent> ># class in the order of> ># their inheritance> >super>().__init__(name)> # Driver Code> Carol>=> Animal(>'Dog'>)>

>

>

Вихід:

Dog cannot swim Dog cannot fly Dog Is a mammal>

Множинне успадкування Python і MRO

У наведеному прикладі клас C успадковує класи A і B і замінює метод age(). Однак у методі age() класу C рядок super(C, self).age() викликає метод age() з наступного класу в MRO. У цьому випадку він викличе метод age() із класу A, оскільки він з’являється перед класом B у MRO.

Python3




class> A:> >def> age(>self>):> >print>(>'Age is 21'>)> class> B:> >def> age(>self>):> >print>(>'Age is 23'>)> class> C(A, B):> >def> age(>self>):> >super>(C,>self>).age()> > c>=> C()> print>(C.__mro__)> print>(C.mro())>

>

>

Вихід:

(, , , ) [, , , ]>