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. Объекты классов. Объекты экземпляров
- Классы и модули. Обращение к классам других модулей
- Перегрузка операторов в классах. Общие сведения. Методы, перегружающие операторы. Примеры
⇑