Объектно-ориентированное программирование в Python

30.11.2018

Теги: PythonWeb-разработкаООП

Объектно-ориентированное программирование (ООП) является методологией разработки программного обеспечения, в основе которой лежит понятие класса и объекта. Каждый объект является экземпляром некоторого класса. Программа создается как некоторая совокупность объектов, которые взаимодействую друг с другом и с внешним миром.

Создание классов и объектов

Создание класса начинвется с ключевого слова 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-разработка • ООП • наследование • полиморфизм • конструктор

Каталог оборудования
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Производители
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Функциональные группы
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.