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

  ⇑


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

  ⇑