Объектно-ориентированное программирование в Python
30.11.2018
Теги: Python • Web-разработка • ООП
Объектно-ориентированное программирование (ООП) является методологией разработки программного обеспечения, в основе которой лежит понятие класса и объекта. Каждый объект является экземпляром некоторого класса. Программа создается как некоторая совокупность объектов, которые взаимодействую друг с другом и с внешним миром.
Создание классов и объектов
Создание класса начинвется с ключевого слова class
. Вот так будет выглядеть минимальный класс:
class SomeClass(): pass
Чтобы создать объект класса необходимо воспользоваться следующим синтаксисом:
someObject = SomeClass()
Класс может содержать свойства и методы. Ниже представлен класс, содержащий свойства color
(цвет), width
(ширина), height
(высота).
class Rectangle(): color = 'green' width = 100 height = 100
Доступ к свойству объекта можно получить следующим образом:
rectangle = Rectangle() print(rectangle.color)
Добавим к нашему классу Rectangle
метод, считающий площадь прямоугольника. Метод — это функция, находящаяся внутри класса. Работа функции предполагает доступ к свойствам созданного объекта. Чтобы метод в классе знал, с каким объектом он работает, первым аргументом ему следует передать параметр self
. Через этот параметр метод может получить доступ к данным объекта: color
, width
и height
.
class Rectangle(): color = 'green' width = 100 height = 100 def square(self): return self.width * self.height rect1 = Rectangle() print(rect1.color) print(rect1.square()) rect2 = Rectangle() rect2.width = 200 rect2.color = 'brown' print(rect2.color) print(rect2.square())
Конструктор класса
Конструктор класса позволяет задать определенные свойства объекта при его создании. Таким образом появляется возможность создавать объекты с уже заранее заданными атрибутами. Конструктором класса является метод:
__init__(self)
Например, для того, чтобы иметь возможность задать цвет, длину и ширину прямоугольника при его создании, добавим к классу Rectangle
следующий конструктор:
class Rectangle(): def __init__(self, color='green', width=100, height=100): self.color = color self.width = width self.height = height def square(self): return self.width * self.height rect1 = Rectangle() print(rect1.color) print(rect1.square()) rect2 = Rectangle('yellow', 30, 40) print(rect2.color) print(rect2.square())
Наследование
Под наследованием понимается возможность создания нового класса на базе существующего. При этом класс-потомок будет содержать те же свойства и методы, что и базовый класс, но при этом его можно (и нужно) расширять через добавление новых методов и свойств. Возможно множественное наследование, в этом случае у класса-потомка есть несколько родителей.
Давайте создадим класс-родитель Figure
и класс-потомок Rectangle
:
class Figure(): def __init__(self, color): self.color = color def getColor(self): return self.color class Rectangle(Figure): def __init__(self, color, width=100, height=100): super().__init__(color) self.width = width self.height = height def square(self): return self.width * self.height rect1 = Rectangle('blue') print(rect1.getColor()) print(rect1.square()) rect2 = Rectangle('red', 40, 50) print(rect2.getColor()) print(rect2.square())
Полиморфизм
Полиморфизм, как правило, используется с позиции переопределения методов базового класса в классе-наследнике. Проще всего это рассмотреть на примере. Добавим в наш базовый класс Figure
метод square()
и переопределим этот метод в классах-наследниках Rectangle
и Circle
:
import math class Figure(): def __init__(self, color): self.color = color def getColor(self): return self.color def square(self): raise BaseException('Невозможно вычислить площадь') class Rectangle(Figure): def __init__(self, color, width=100, height=100): super().__init__(color) self.width = width self.height = height def square(self): return self.width * self.height class Circle(Figure): def __init__(self, color, radius=50): super().__init__(color) self.radius = radius def square(self): return math.pi * self.radius**2 rectangle = Rectangle('blue') print(rectangle.getColor()) print(rectangle.square()) circle = Circle('red') print(circle.getColor()) print(circle.square())
Поиск: Python • Web-разработка • ООП • наследование • полиморфизм • конструктор