Перевизначення методу в Python

Перевизначення методу в Python

Необхідна умова: Спадкування в Python

Перевизначення методу — це здатність будь-якої об’єктно-орієнтованої мови програмування, яка дозволяє підкласу або дочірньому класу забезпечувати конкретну реалізацію методу, який уже надається одним із його суперкласів або батьківських класів. Якщо метод у підкласі має таке ж ім’я, ті самі параметри або підпис і той самий тип (або підтип) повернення, що й метод у його суперкласі, тоді метод у підкласі називається перевизначити метод в супер-класі.

перевизначення в Python

Версія методу, що виконується, визначатиметься об’єктом, який використовується для його виклику. Якщо для виклику методу використовується об’єкт батьківського класу, тоді буде виконана версія в батьківському класі, але якщо для виклику методу використовується об’єкт підкласу, тоді буде виконана версія в дочірньому класі. Іншими словами, саме тип об’єкта, на який посилається (а не тип посилальної змінної), визначає, яка версія перевизначеного методу буде виконана.

приклад:




# Python program to demonstrate> # method overriding> > > # Defining parent class> class> Parent():> > > # Constructor> > def> __init__(> self> ):> > self> .value> => 'Inside Parent'> > > # Parent's show method> > def> show(> self> ):> > print> (> self> .value)> > # Defining child class> class> Child(Parent):> > > # Constructor> > def> __init__(> self> ):> > self> .value> => 'Inside Child'> > > # Child's show method> > def> show(> self> ):> > print> (> self> .value)> > > # Driver's code> obj1> => Parent()> obj2> => Child()> > obj1.show()> obj2.show()>

Вихід:

 Inside Parent Inside Child 

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

  1. Множинне успадкування: Коли клас є похідним від кількох базових класів, це називається множинним успадкуванням.

    приклад: Давайте розглянемо приклад, коли ми хочемо перевизначити метод лише одного батьківського класу. Нижче наведено реалізацію.




    # Python program to demonstrate> # overriding in multiple inheritance> > > # Defining parent class 1> class> Parent1():> > > # Parent's show method> > def> show(> self> ):> > print> (> 'Inside Parent1'> )> > # Defining Parent class 2> class> Parent2():> > > # Parent's show method> > def> display(> self> ):> > print> (> 'Inside Parent2'> )> > > # Defining child class> class> Child(Parent1, Parent2):> > > # Child's show method> > def> show(> self> ):> > print> (> 'Inside Child'> )> > > # Driver's code> obj> => Child()> > obj.show()> obj.display()>

    Вихід:

     Inside Child Inside Parent2 
    Багаторівневе успадкування: коли ми маємо стосунки між дитиною та онуком.

    приклад: Давайте розглянемо приклад, де ми хочемо перевизначити лише один метод одного з його батьківських класів. Нижче наведено реалізацію.




    # Python program to demonstrate> # overriding in multilevel inheritance> > > # Python program to demonstrate> # overriding in multilevel inheritance> > > class> Parent():> > > # Parent's show method> > def> display(> self> ):> > print> (> 'Inside Parent'> )> > > # Inherited or Sub class (Note Parent in bracket)> class> Child(Parent):> > > # Child's show method> > def> show(> self> ):> > print> (> 'Inside Child'> )> > # Inherited or Sub class (Note Child in bracket)> class> GrandChild(Child):> > > # Child's show method> > def> show(> self> ):> > print> (> 'Inside GrandChild'> )> > # Driver code> g> => GrandChild()> g.show()> g.display()>

    Вихід:

     Inside GrandChild Inside Parent 

Виклик методу Parent у перевизначеному методі

Методи батьківського класу також можна викликати в перевизначених методах. Загалом цього можна досягти двома шляхами.

    Використання Classname: Методи класу Parent можна викликати за допомогою Parent classname.method> всередині перевизначеного методу.

    приклад:




    # Python program to demonstrate> # calling the parent's class method> # inside the overridden method> > > class> Parent():> > > def> show(> self> ):> > print> (> 'Inside Parent'> )> > class> Child(Parent):> > > def> show(> self> ):> > > # Calling the parent's class> > # method> > Parent.show(> self> )> > print> (> 'Inside Child'> )> > # Driver's code> obj> => Child()> obj.show()>

    Вихід:

     Inside Parent Inside Child 
    Використання Super(): Python super()> функція надає нам можливість явно посилатися на батьківський клас. Це в основному корисно, коли ми повинні викликати функції суперкласу. Він повертає проксі-об’єкт, який дозволяє посилатися на батьківський клас за допомогою «super».

    приклад 1:




    # Python program to demonstrate> # calling the parent's class method> # inside the overridden method using> # super()> > > class> Parent():> > > def> show(> self> ):> > print> (> 'Inside Parent'> )> > class> Child(Parent):> > > def> show(> self> ):> > > # Calling the parent's class> > # method> > super> ().show()> > print> (> 'Inside Child'> )> > # Driver's code> obj> => Child()> obj.show()>

    Вихід:

     Inside Parent Inside Child 

    приклад 2:




    # Program to define the use of super()> # function in multiple inheritance> class> GFG1:> > def> __init__(> self> ):> > print> (> 'HEY !!!!!! GfG I am initialised(Class GEG1)'> )> > > def> sub_GFG(> self> , b):> > print> (> 'Printing from class GFG1:'> , b)> > # class GFG2 inherits the GFG1> class> GFG2(GFG1):> > def> __init__(> self> ):> > print> (> 'HEY !!!!!! GfG I am initialised(Class GEG2)'> )> > super> ().__init__()> > > def> sub_GFG(> self> , b):> > print> (> 'Printing from class GFG2:'> , b)> > super> ().sub_GFG(b> +> 1> )> > # class GFG3 inherits the GFG1 ang GFG2 both> class> GFG3(GFG2):> > def> __init__(> self> ):> > print> (> 'HEY !!!!!! GfG I am initialised(Class GEG3)'> )> > super> ().__init__()> > > def> sub_GFG(> self> , b):> > print> (> 'Printing from class GFG3:'> , b)> > super> ().sub_GFG(b> +> 1> )> > > # main function> if> __name__> => => '__main__'> :> > > # created the object gfg> > gfg> => GFG3()> > > # calling the function sub_GFG3() from class GHG3> > # which inherits both GFG1 and GFG2 classes> > gfg.sub_GFG(> 10> )>

    Вихід:

     HEY !!!!!! GfG I am initialised(Class GEG3) HEY !!!!!! GfG I am initialised(Class GEG2) HEY !!!!!! GfG I am initialised(Class GEG1) Printing from class GFG3: 10 Printing from class GFG2: 11 Printing from class GFG1: 12