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

 


Связанные темы