Python. Спадковість у класах. Правила




Python. Спадковість у класах. Правила застосування спадковості. Приклади


Зміст


Пошук на інших ресурсах:

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

 


Зв’язані теми