Python. Спадковість у класах. Правила застосування спадковості. Приклади
Зміст
- 1. Реалізація спадковості у класах. Загальні положення
- 2. Правила, що визначають роботу механізму спадковості у Python. Приклади
- 2.1. Правило 1. Задавання імені суперкласу
- 2.2. Правило 2. Успадкування атрибутів суперкласу підкласом
- 2.3. Правило 3. Успадкуваня атрибутів суперкласу екземпляром підкласу
- 2.4. Правило 4. Звертання до атрибуту суперкласу з екземпляру класу
- 2.5. Правило 5. Зміни в підкласі не зачіпають суперклас. Перевантаження атрибутів
- 3. Приклад використання спадковості. Розширення класу Point до класу ColorPoint
- Зв’язані теми
Пошук на інших ресурсах:
1. Реалізація спадковості у класах. Загальні положення
Так як і в інших мовах програмування, у мові Python реалізовано механізм спадковості. Спадковість – це можливість розширення (успадкування) раніше написаного програмного коду класу з метою його доповнення, удосконалення чи прив’язки під нові вимоги.
Спадковість дозволяє утворювати ієрархії класів. У цих ієрархіях класи верхніх рівнів представляють найбільш узагальнені атрибути, а класи нижніх рівнів (підкласи) реалізують більш детальну спеціалізацію атрибутів. Ієрархії класів утворюють дерево ієрархії, в якому чим нижче знаходиться клас, тим більше він є спеціалізованим.
Якщо один клас успадковує (розширює) інший клас, то цей клас називається підклас. А клас, який успадковується, називається суперклас.
⇑
2. Правила, що визначають роботу механізму спадковості у Python. Приклади
У мові Python спадковість реалізується з дотриманням нижченаведених правил.
2.1. Правило 1. Задавання імені суперкласу
Якщо деякий клас успадковує інший суперклас, то ім’я суперкласу задається в круглих дужках в заголовку інструкції class.
Наприклад.
# Клас A - є суперкласом для класу B class A: # атрибути класу A ... # Клас B - є підкласом класу A class B(A): # атрибути класу B ...
⇑
2.2. Правило 2. Успадкування атрибутів суперкласу підкласом
Підклас успадковує атрибути своїх суперкласів.
Наприклад.
# Клас A - є суперкласом для класів B, C class A: # Атрибут класу A: метод AAA() def AAA(self): print("class A. Method AAA()") # Клас B - є підкласом класу A class B(A): # Атрибут класу B: Метод BBB() def BBB(self): # З методу BBB() можна доступитись # до атрибуту AAA() класу A self.AAA() # буде викликано A.AAA() print("class B. Method BBB()") # Клас C - є підкласом класів A, B class C(B): # Атрибут класу C: метод CCC() def CCC(self): # З методу CCC() можна доступитись # до атрибуту AAA() класу A # та до атрибуту BBB() класу B. self.AAA() self.BBB() print("class C. Method CCC()") # Тестування роботи механізму спадковості # 1. Використання екземпляру класу A objA = A() objA.AAA() # виклик методу AAA() класу A print("----------------")
Після запуску на виконання програма видала наступний результат
class A. Method AAA() ---------------- class A. Method AAA() class A. Method AAA() class B. Method BBB() ---------------- class A. Method AAA() class A. Method AAA() class B. Method BBB() class A. Method AAA() class A. Method AAA() class B. Method BBB() class C. Method CCC()
⇑
2.3. Правило 3. Успадкуваня атрибутів суперкласу екземпляром підкласу
Екземпляри класів успадковують атрибути всіх доступних класів. Наприклад. З екземпляру objB можна доступитись до методів (атрибутів) A1(), A2(), A3() класу A.
# Клас A - є суперкласом для класу B class A: # Атрибути класу A: def A1(self): print("A.A1()") def A2(self): print("A.A2()") def A3(self): print("A.A3()") # Клас B - є підкласом класу A class B(A): # Атрибути класу B: def B1(self): print("B.B1()") # Доступ з екземпляру підкласу B objB = B() # Виклик методів суперкласу A objB.A1() objB.A2() objB.A3()
Результат виконання програми
A.A1() A.A2() A.A3()
⇑
2.4. Правило 4. Звертання до атрибуту суперкласу з екземпляру класу
Щоб доступитись до атрибуту суперкласу з екземпляру класу, потрібно виконати звертання на кшталт
obj.attribute
тут
- obj – ім’я екземпляру підкласу;
- attribute – ім’я атрибуту суперкласу.
Таке звертання включає в себе:
- посилання на екземпляри і класи з інструкції class (наприклад A.attribute);
- посилання на атрибути аргументу екземпляру self у методах класу (наприклад self.attribute).
Приклад використання даного правила наведено у попередніх двох правилах 3.
⇑
2.5. Правило 5. Зміни в підкласі не зачіпають суперклас. Перевантаження атрибутів
Якщо в підкласі вносяться зміни, то ці зміни не зачіпають суперкласи. Це стосується також заміни імен суперкласів у підкласах, що розміщені на нижчих рівнях в дереві класів. У цьому випадку змінюється тільки успадкована поведінка. Заміна атрибутів суперкласу за рахунок їх перевизначення в підкласах називається перевантаженням.
Наприклад. У нижченаведеному коді демонструється заміщення імені методу HelloWorld() класу A в підкласі B.
# Клас A - є суперкласом для класу B class A: # Атрибут класу A - метод HelloWorld() def HelloWorld(self): print("Class A: Hello world!") # Клас B - є підкласом класу A class B(A): # У класі B є атрибут з таким самим іменем # як у класі A def HelloWorld(self): print("Class B: Hello world!") # Продемонструвати заміщення імені # 1. Оголосити екземпляр класу B objB = B() # 2. Викликати метод HelloWorld() objB.HelloWorld() # Class B: Hello world! - метод класу B # 3. Оголосити екземпляр класу A objA = A() # 4. Викликати метод HelloWorld() objA.HelloWorld() # Class A: Hello world! - метод класу A
Результат виконання програми
Class B: Hello world! Class A: Hello world!
Як видно з результату, заміщення імені методу в підкласі B не впливає на однойменний метод класу A.
⇑
3. Приклад використання спадковості. Розширення класу Point до класу ColorPoint
Умова задачі. Задано клас Point, що описує точку з координатами x, y на координатній площині. Використовуючи механізм спадковості потрібно розширити можливості класу Point шляхом додавання нового атрибуту кольору. Для цього реалізувати підклас PointColor.
У класі Point реалізувати наступні атрибути:
- координати точки;
- метод ініцалізації, що отримує 2 параметри – координати точки x, y;
- метод обчислення відстані від точки до початку координат;
- метод getPoint(), що повертає точку у вигляді списку.
У підкласі PointColor реалізувати такі атрибути:
- колір точки color;
- метод початкової ініціалізації, який отримує 3 параметри: координати точки та колір;
- метод доступу до кольору color з іменем getColor().
Розв’язок. Текст програми, що розв’язує задачу, наступний.
import math # Клас, що описує точку на координатній площині class Point: # Метод початкової ініціалізації даних класу def __init__(self, x, y): self.x = x self.y = y # Метод обчислення відстані від точки до початку координат def length(self): # теорема Піфагора len = math.sqrt(self.x*self.x+self.y*self.y) return len # Метод, що повертає координати точки у вигляді списку def getPoint(self): return [self.x, self.y] # Клас, що розширює клас Point class PointColor(Point): # Метод початкової ініцалізації def __init__(self, x, y, color): # доступ до x, y суперкласу Point self.x = x self.y = y # ввести нову змінну color self.color = color # Повернути колір def getColor(self): return self.color; # Використання класу Point point1 = Point(3, 4) print("point1.length = ", point1.length()) # length = 5.0 print("point11 = ", point1.getPoint()) # Використання класу PointColor point2 = PointColor(5, 6, "Red") print("point2.x = ", point2.getPoint()[0]) print("point2.y = ", point2.getPoint()[1]) print("point2.color = ", point2.getColor())
Результат роботи програми
point1.length = 5.0 point11 = [3, 4] point2.x = 5 point2.y = 6 point2.color = Red
⇑
Зв’язані теми
- Класи в Python. Загальні поняття. Ключове слово class. Об’єкти класів. Об’єкти екземплярів
- Класи і модулі. Звертання до класів інших модулів
⇑