ООП в Python

ООП в Python

Объектно-ориентированным программированием (ООП) называется такой подход к программированию, в котором используются понятия класса и объекта. Под инкапсуляцией понимается объединение в рамках одной сущности (класса) определенных данных и методов для работы с ними (и не только). Например, можно определить класс "холодильник", который будет содержать следующие данные: производитель, объем, количество камер хранения, потребляемая мощность и т.п., и методы: открыть/закрыть холодильник, включить/выключить. При этом класс становится как бы новым типом данных в рамках разрабатываемой программы. Можно создавать переменные этого нового типа, такие переменные называются объекты или экземпляры класса. Терминология объектно-ориентированного программирования Класс (Class): Определенный программистом прототип программируемого объекта с набором атрибутов (переменных и методов), которые описывают данный объект. Доступ к аттрибутам и методам осуществляется через точку Переменная класса, его свойство (Class variable): Переменная, доступная для всех экземпляров данного класса. Определяется внутри класса, но вне любых методов класса. Экземпляр класса, объект (Instance): Отдельный объект-представитель определенного класса. Переменная экземпляра класса (Instance variable): Переменная определенная внутри метода класса, принадлежащая только к этому классу. Метод (Method): Особая функция, определенная внутри класса. Наследование (Inheritance): Передача атрибутов и методов родительского класса дочерним классам. Перегрузка функций (Function overloading): Изменение работы метода, унаследованного дочерним классом от родительского класса. Перегрузка операторов (Operator overloading): Определение работы операторов с экземплярами данного класса. Многие сначала не понимают для чего нужно ООП. Однако у данного подхода есть множество преимуществ. Например, когда у вас есть готовый класс, который используется в разных программах, и подключается как отдельный модуль, чтобы расширить или изменить функциональность данного класса, необязательно переделывать его с нуля. Можно просто наследовать данный класс, и изменить его копию. При этом оригинальный модуль не изменится, и другие программы смогут использовать его как прежде. Концепция наследования в программировании позволяет сократить время разработки, упростить процесс написания программы как сейчас, так и в будущем, когда один из заказчиков захочет внести "небольшие правки" в типовой проект. Важно помнить, что иногда проще создать дополнительный базовый класс, наследовать от него и расширять по мере необходимости, чем сразу написать готовый класс. Полиморфизм предполагает разную реализацию методов с одинаковыми именами. То есть мы создаем дочерний класс, который наследуем от имеющегося, и в этом дочернем классе переопределяем по своему какой-то метод (пишем другую функцию с тем же именем, которая уже была в классе-родителе, но внутри работающую по-другому). Это полезно, когда у нас есть готовый модуль с классом, в котором нас удовлетворяет всё кроме одного какого-то метода. Чтобы не создавать все с нуля мы просто наследуем класс и переопределяем не понравившийся нам метод по-своему. Приведем пример простой программы где создаются и наследуются классы.

# Объявляем класс под названием myclass
# (название может быть любым другим)
class myclass:
    # Указываем значения аргументов-свойств класса
    arg1='Я первое свойство класса'
    arg2='Я второе свойство класса'
    # Функция конструктор которая запускается при инициализации класса  
    def __init__(self, arg0): # аргумент self должен быть во всех методах класса.
        # arg0 это аргумент который передается классу при его создании
        # Может быть только в конструкторе класса
        print('Я '+arg0+' класса, я родился')
    # Функция внутри класса является его методом
    def gethello(self, username):
        # аргумент self должен быть во всех методах класса.
        # аргумент username мы придумали сами,  
        # будем принимать его при вызове метода
        # во внутреннюю переменную s кладем слово Привет
        # и имя username (аргумент метода)
        s='Привет, '+username
        # Метод  возвращает значение внутренней переменной s
        return s

# Создаем экземляр класса в переменной a
a=myclass('первый экземпляр')
# В переменную b помещаем результат метода a.gethello,
# передав методу аргумент 'Елена'
b=a.gethello('Елена')
# Печатаем переменную b
print(b)

# Печатаем первое свойство экземпляра класса
print(a.arg1)
# Изменяем свойство arg2 у данного экземпляра класса
a.arg2='Новое значение второго свойства'
# Печатаем второе свойство экземпляра класса
print(a.arg2)

# Создаем еще один экземпляр класса
c=myclass('второй экземпляр')
# Видим что его свойство arg2 осталось прежним
print(c.arg2)

# Создаем дочерний класс myclass2 из ранее созданного myclass
# c помощью наследования и добавляем в него arg3
# и метод getgoodbye
class myclass2(myclass):
    arg3='Я третье свойство, меня не было в myclass'
    # Добавляем метод getgoodbye которого не было в myclass
    def getgoodbye(self, username):
        s='До свидания, '+username
        return s
        
# Убедимся что в дочернем классе сохранились все свойства и методы
# родительского класса и добавились новые
# Создаем экземпляр класса myclass2
d=myclass2('экземпляр дочернего')
# Печатаем аргументы-свойства класса
print(d.arg1)
print(d.arg2)
print(d.arg3)
# Проверяем работу методов-функций класса
print(d.gethello('Василий'))
print(d.getgoodbye('Василий'))

# Создадим еще один класс унаследовав его от myclass2
# и переопределим в нем метод gethello
# продемонстрировав полиморфизм

class myclass3(myclass2):
    # Переопредилим объявленный в родительских классах
    # метод gethello
    def gethello(self, username):
        s='Саламалейкум, о уважаемый '+username
        return s

e=myclass3('класс унаследованный от myclass2')
print(e.gethello('Артём'))

ООП в Python Лого Pythono.ru ООП в Python

Если у вас есть Android телефон, вы можете скачать наш учебник по Python