logo

Спадкування в Python

Одне з основних понять в об'єктно-орієнтоване програмування (ООП) мови є успадкуванням. Це механізм, який дозволяє створювати ієрархію класів, які мають спільний набір властивостей і методів, шляхом отримання класу від іншого класу. Спадкування — це здатність одного класу отримувати або успадковувати властивості іншого класу.

Перевагами спадкування є:

підрядок у java

Спадкування дозволяє вам успадковувати властивості класу, тобто базового класу, іншому, тобто похідному класу. Переваги успадкування в Python такі:



  • Він добре відображає відносини в реальному світі.
  • Це забезпечує багаторазове використання коду. Нам не потрібно писати один і той же код знову і знову. Крім того, це дозволяє нам додавати більше функцій до класу, не змінюючи його.
  • Він має транзитивний характер, що означає, що якщо клас B успадковує інший клас A, то всі підкласи B автоматично успадковують клас A.
  • Спадкування пропонує просту, зрозумілу структуру моделі.
  • Менші витрати на розвиток і обслуговування є результатом спадщини.

Синтаксис успадкування Python

Синтаксис простого успадкування в Python такий:

Class BaseClass: {Body} Class DerivedClass(BaseClass): {Body}>

Створення батьківського класу

Батьківський клас — це клас, властивості якого успадковуються дочірнім класом. Давайте створимо батьківський клас під назвою особа який має a Дисплей спосіб відображення інформації про людину.

Python3




# A Python program to demonstrate inheritance> class> Person(>object>):> > ># 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>)> # Driver code> emp>=> Person(>'Satyam'>,>102>)># An Object of Person> emp.Display()>

>

>

Вихід:

Satyam 102>

Створення дочірнього класу

Дочірній клас — це клас, який управляє властивостями свого батьківського класу. тут Емп це інший клас, який успадковує властивості особа клас (базовий клас).

Python3




class> Emp(Person):> > >def> Print>(>self>):> >print>(>'Emp class called'>)> > Emp_details>=> Emp(>'Mayank'>,>103>)> # calling parent class function> Emp_details.Display()> # Calling child class function> Emp_details.>Print>()>

>

>

Вихід:

Mayank 103 Emp class called>

Приклад успадкування в Python

Давайте розглянемо приклад простого успадкування Python, у якому дочірній клас успадковує властивості свого батьківського класу. У цьому прикладі «Person» є батьківським класом, а «Employee» є його дочірнім класом.

Python3




# A Python program to demonstrate inheritance> # Base or Super class. Note object in bracket.> # (Generally, object is made ancestor of all classes)> # In Python 3.x 'class Person' is> # equivalent to 'class Person(object)'> class> Person(>object>):> ># Constructor> >def> __init__(>self>, name):> >self>.name>=> name> ># To get name> >def> getName(>self>):> >return> self>.name> ># To check if this person is an employee> >def> isEmployee(>self>):> >return> False> # Inherited or Subclass (Note Person in bracket)> class> Employee(Person):> ># Here we return true> >def> isEmployee(>self>):> >return> True> # Driver code> emp>=> Person(>'Geek1'>)># An Object of Person> print>(emp.getName(), emp.isEmployee())> emp>=> Employee(>'Geek2'>)># An Object of Employee> print>(emp.getName(), emp.isEmployee())>

>

>

Вихід:

Geek1 False Geek2 True>

Що таке клас об’єктів у Python?

Як Клас об'єктів Java , у Python (з версії 3. x) об’єкт є коренем усіх класів.

  • У Python 3.x клас Test(object) і клас Test однакові.
  • У Python 2. x клас Test(object) створює клас з об’єктом як батьківський (так званий клас нового стилю), а клас Test створює клас старого стилю (без батьківського об’єкта).

Підкласи (виклик конструктора батьківського класу)

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

приклад: ім'я_підкласу (назва_суперкласу)

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

Змінні, визначені в __init__(), називаються змінними екземплярів або об’єктами. Отже, «name» та «idnumber» є об’єктами класу Person. Подібним чином «зарплата» та «посада» є об’єктами класу Employee. Оскільки клас Employee успадковує клас Person, «name» та «idnumber» також є об’єктами класу Employee.

Python3




# Python code to demonstrate how parent constructors> # are called.> # parent class> class> Person(>object>):> ># __init__ is known as the constructor> >def> __init__(>self>, name, idnumber):> >self>.name>=> name> >self>.idnumber>=> idnumber> >def> display(>self>):> >print>(>self>.name)> >print>(>self>.idnumber)> # child class> class> Employee(Person):> >def> __init__(>self>, name, idnumber, salary, post):> >self>.salary>=> salary> >self>.post>=> post> ># invoking the __init__ of the parent class> >Person.__init__(>self>, name, idnumber)> # creation of an object variable or an instance> a>=> Employee(>'Rahul'>,>886012>,>200000>,>'Intern'>)> # calling a function of the class Person using its instance> a.display()>

>

>

Вихід:

Rahul 886012>

Програма Python для демонстрації помилки, якщо ми забуваємо викликати __init__() батьківського

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

Python3




class> A:> >def> __init__(>self>, n>=>'Rahul'>):> >self>.name>=> n> class> B(A):> >def> __init__(>self>, roll):> >self>.roll>=> roll> object> => B(>23>)> print>(>object>.name)>

>

>

Вихід:

Traceback (most recent call last): File '/home/de4570cca20263ac2c4149f435dba22c.py', line 12, in print (object.name) AttributeError: 'B' object has no attribute 'name'>

Функція super().

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

приклад: функція super() із простим успадкуванням Python

У цьому прикладі ми створили об’єкт «obj» дочірнього класу. Коли ми викликали конструктор дочірнього класу «Student», він ініціалізував члени даних значеннями, переданими під час створення об’єкта. Потім за допомогою функції super() ми викликали конструктор батьківського класу.

Python3




# parent class> class> Person():> >def> __init__(>self>, name, age):> >self>.name>=> name> >self>.age>=> age> >def> display(>self>):> >print>(>self>.name,>self>.age)> # child class> class> Student(Person):> >def> __init__(>self>, name, age):> >self>.sName>=> name> >self>.sAge>=> age> ># inheriting the properties of parent class> >super>().__init__(>'Rahul'>, age)> >def> displayInfo(>self>):> >print>(>self>.sName,>self>.sAge)> obj>=> Student(>'Mayank'>,>23>)> obj.display()> obj.displayInfo()>

>

>

Вихід:

linux make
Rahul 23 Mayank 23>

Додавання властивостей

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

Python3




# parent class> class> Person():> >def> __init__(>self>, name, age):> >self>.name>=> name> >self>.age>=> age> >def> display(>self>):> >print>(>self>.name,>self>.age)> # child class> class> Student(Person):> >def> __init__(>self>, name, age, dob):> >self>.sName>=> name> >self>.sAge>=> age> >self>.dob>=> dob> ># inheriting the properties of parent class> >super>().__init__(>'Rahul'>, age)> >def> displayInfo(>self>):> >print>(>self>.sName,>self>.sAge,>self>.dob)> obj>=> Student(>'Mayank'>,>23>,>'16-03-2000'>)> obj.display()> obj.displayInfo()>

>

>

Вихід:

Тут ми бачимо, що ми додали нову властивість до дочірнього класу, тобто дату народження (dob).

Rahul 23 Mayank 23 16-03-2000>

Різні типи успадкування Python

У Python існує 5 різних типів успадкування. Вони такі:

    Одинарне успадкування: коли дочірній клас успадковує лише один батьківський клас, це називається єдиним успадкуванням. Ми бачили приклад вище. Множинне успадкування: коли дочірній клас успадковує кілька батьківських класів, це називається множинним успадкуванням.

На відміну від Java, python демонструє багаторазове успадкування.

Python3




# Python example to show the working of multiple> # inheritance> class> Base1(>object>):> >def> __init__(>self>):> >self>.str1>=> 'Geek1'> >print>(>'Base1'>)> class> Base2(>object>):> >def> __init__(>self>):> >self>.str2>=> 'Geek2'> >print>(>'Base2'>)> class> Derived(Base1, Base2):> >def> __init__(>self>):> ># Calling constructors of Base1> ># and Base2 classes> >Base1.__init__(>self>)> >Base2.__init__(>self>)> >print>(>'Derived'>)> >def> printStrs(>self>):> >print>(>self>.str1,>self>.str2)> ob>=> Derived()> ob.printStrs()>

>

>

Вихід:

Base1 Base2 Derived Geek1 Geek2>
    Багаторівневе успадкування: коли ми маємо стосунки між дитиною та онуком. Це означає, що дочірній клас успадковує від свого батьківського класу, який, у свою чергу, успадковує від свого батьківського класу.

Python3




# A Python program to demonstrate inheritance> # Base or Super class. Note object in bracket.> # (Generally, object is made ancestor of all classes)> # In Python 3.x 'class Person' is> # equivalent to 'class Person(object)'> class> Base(>object>):> ># Constructor> >def> __init__(>self>, name):> >self>.name>=> name> ># To get name> >def> getName(>self>):> >return> self>.name> # Inherited or Sub class (Note Person in bracket)> class> Child(Base):> ># Constructor> >def> __init__(>self>, name, age):> >Base.__init__(>self>, name)> >self>.age>=> age> ># To get name> >def> getAge(>self>):> >return> self>.age> # Inherited or Sub class (Note Person in bracket)> class> GrandChild(Child):> ># Constructor> >def> __init__(>self>, name, age, address):> >Child.__init__(>self>, name, age)> >self>.address>=> address> ># To get address> >def> getAddress(>self>):> >return> self>.address> # Driver code> g>=> GrandChild(>'Geek1'>,>23>,>'Noida'>)> print>(g.getName(), g.getAge(), g.getAddress())>

>

>

Вихід:

Geek1 23 Noida>
    Ієрархічне успадкування Більш ніж один похідний клас може бути створений з однієї бази. Гібридне успадкування: ця форма поєднує більше ніж одну форму успадкування. По суті, це суміш більш ніж одного типу успадкування.

Щоб дізнатися більше, прочитайте цю статтю: Типи успадкування в Python

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

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

У спадкуванні Python ми можемо зробити змінну екземпляра приватною, додавши подвійне підкреслення перед її назвою. Наприклад:

Python3


b плюсове дерево



# Python program to demonstrate private members> # of the parent class> class> C(>object>):> >def> __init__(>self>):> >self>.c>=> 21> ># d is private instance variable> >self>.__d>=> 42> class> D(C):> >def> __init__(>self>):> >self>.e>=> 84> >C.__init__(>self>)> object1>=> D()> # produces an error as d is private instance variable> print>(object1.c)> print>(object1.__d)>

>

>

Вихід:

Тут ми бачимо, що коли ми намагалися надрукувати змінну «c», її значення 21 друкується на консолі. Коли ми намагалися надрукувати «d», виникала помилка. Це відбувається тому, що змінна «d» стає закритою за допомогою підкреслення. Він недоступний для дочірнього класу «D», отже, помилка.

21 File '/home/993bb61c3e76cda5bb67bd9ea05956a1.py', line 16, in print (object1.d) AttributeError: type object 'D' has no attribute 'd'>