- Классы
- Конструкторы
- Динамические классы
- Статические методы
- Методы классов
- Основные принципы ООП в языке Python
ООП – модель программирования, согласно которой данные программы представляются в виде множества объектов. Сами объекты при этом называются экземплярами класса. Последние, в свою очередь, имеют строгую иерархию наследования.
- Увеличение уровня абстракции и читаемости кода, благодаря использованию аналогии с объектами реального мира.
- Структурирование кода на качественно ином уровне.
- Программирование большинства современных проектов строится на основе ООП, поскольку в долгосрочной перспективе такой код легче поддерживать, модифицировать, расширять.
- Если же код программы состоит из одного скрипта и не требует дальнейшей поддержки, то в этом случае использовать ООП нецелесообразно.
- Такой подход несколько уменьшает быстродействие программ, поэтому при работе с большим потоком обрабатываемых данных, возможно, стоит обойтись без ООП.
Python – высокоуровневый язык, который поддерживает ООП. Сама структура языка построена таким образом, что все данные в нем представлены в виде объектов.
Классы
Классы можно представить в виде макета дома с набором характеристик. А каждый дом, построенный индивидуально, будет называться экземпляром этого класса.
Отношение «класс – объект» такое же, как, например, отношение «автомобиль – BMW». Для создания класса применяется идентификатор class. Возьмем в качестве примера простейший класс Pupil:
class Pupil:
name = «Tom»
age = 20
speciality = «Computer science»
def study(self):
print(«Учиться»)
def sleep(self):
print(«Спать»)
Name, age, speciality – атрибуты выше рассмотренного класса; study, sleep – методы. Аргумент self ссылается на объект, в котором вызывается метод, и говорит нам о том, что study и sleep – методы класса, а не просто процедуры.
Для использования атрибутов и методов класса следует создать его экземпляры (объекты):
std1 = Pupil();
std2 = Pupil();
При выводе на печать типа данных созданного нами объекта получим следующее:
print (type(std1))
<class ‘__main__.Pupil’>
Тип std1 относится к классу Pupil.
Чтобы получить доступ созданного объекта к атрибутам и методам, следует использовать оператор точку . :
std1.name = «John»;
std1.age = 21;
print (std1.name + » » + str(std1.age) + » » + std1.speciality)
std1.study()
- John 21 Computer science
Учиться
Обратите внимание на то, что мы изменили атрибуты name, age экземпляра, устанавливаемые по умолчанию, speciality осталась без изменений.
Для того чтобы посмотреть все атрибуты и методы созданного объекта, можно воспользоваться функцией dir.
print(dir(std1))
Нетрудно заметить, что в список выдачи вошли недавно созданные пользовательские атрибуты и методы. Атрибут __dict__ – словарь – содержит в себе список всех пользовательских атрибутов.
Следует помнить о том, что атрибуты класса разделяются между всеми экземплярами этого класса, а атрибуты экземпляров принадлежат только конкретному экземпляру. Поясним это на примере все того же класса Pupil:
# класс студент
class Pupil:
pupil_count = 0
def add_Pupil(self, name, age, speciality):
self.name = name
self.age = age
self.speciality = speciality
Pupil.pupil_count += 1
В данном случае атрибут класса – pupil_count; name, age, speciality – атрибуты экземпляра. Метод add_pupil() увеличивает атрибут pupil_count на 1.
Создадим несколько объектов класса Pupil с вызовом метода add_pupil():
std1 = Pupil()
std1.add_pupil(«Tom», 20, «Computer science»)
print(std1.pupil_count)
std2 = Pupil()
std2.add_pupil(«John», 21, «Math»)
print(std2.pupil_count)
- 1
2
Как видим, значение атрибута pupil_count увеличилось на 1 при инициализации второго студента, следовательно, атрибуты класса разделяются между экземплярами.
Конструкторы
Рассмотрим еще один пример, как можно создавать классы с определенными заранее характеристиками по умолчанию, используя метод __init__:
class Pupil:
#конструктор
def __init__(self, name, age, speciality):
self.name = name
self.age = age
self.speciality = speciality
std1 = Pupil(«Tom», 20, «Computer science»)
print(std1.name, std1.age, std1.speciality)
- Tom 20 Computer science
Как только мы создаем std1, сразу же определяем для него значения полей name, age, speciality напрямую.
Динамические классы
При создании классов можно обойтись без объявления атрибутов и методов и добавить их потом с помощью ключевого слова pass:
def addPupil(self, name, age, speciality):
self.name = name
self.age = age
self.speciality = speciality
print (name + » » + str(age) + » » + speciality)
class Pupil:
pass
Pupil.add_pupil = addStudent
std1 = Pupil()
std1.add_pupil(«Tom», 20, «Computer Science»)
- Tom 20 Computer Science
Статические методы
Могут быть вызваны как из экземпляра, так и из самого класса:
class Pupil:
@staticmethod
def study():
print(«Учить»)
std1 = Pupil()
Pupil.study()
std1.study()
- Учить
Учить
Методы классов
Создаются с помощью ключевого слова @classmethod и могут быть вызваны внутри этого класса, а не только в контексте экземпляра:
class Pupil:
@classmethod
def sleep(cls):
print(«Спать»)
Pupil.sleep()
- Спать
Основные принципы ООП в языке Python
Парадигма ООП построена на 3 основных принципах:
- Инкапсуляция – сокрытие данных, т. е. классы не имеют прямого доступа к полям друг друга, а взаимодействие между ними осуществляется через публичные методы.
- Наследование – название говорит само за себя. Дочерний класс наследует свойства и методы родительского, тем самым реализуя повторное использование.
- Полиморфизм – это способность одного и того же объекта вести себя по-разному в зависимости от того, в контексте какого класса он используется. Полиморфизм связан с созданием перегружаемых виртуальных методов.
Рассмотрим на конкретных примерах, как все эти принципы реализованы в Python.
Инкапсуляция
Для того чтобы объявить метод приватным, достаточно перед именем написать нижнее подчеркивание:
Двойное подчеркивание при именовании переменной делает атрибут защищенным и доступным только внутри этого класса:
- AttributeError: ‘Pupil’ object has no attribute ‘name’
Невозможно получить доступ к атрибутам класса Pupil.
Наследование
Возьмем несколько классов, один из которых наследует свойства другого:
class Pupil:
def __init__(self, name, age, speciality):
self.name = name
self.age = age
self.speciality = speciality
class Sophmore(Pupil):
year_of_educ = 2
std1 = Sophmore(«Tom», 20, «Computer science»)
print(std1.name, std1.age, std1.speciality)
Sophmore – дочерний класс – наследует атрибуты name, age, speciality родительского класса Pupil.
Помимо этого, в Python реализована поддержка множественного наследования. Например, можно создать родительский класс с несколькими потомками или дочерний с несколькими родителями.
Полиморфизм
Предполагает использование виртуальных методов, т. е. дочерние классы могут расширять и переопределять методы при решении одной и той же задачи.
class Pupil:
def study(self):
print(«Учить в зависимости от курса»)
class Sophmore(Pupil):
def study(self):
print(«Учить предметы для второго курса»)
std = Pupil()
std.study()
soph = Sophmore()
soph.study()
- Учить в зависимости от курса
Учить предметы для второго курса
Изучить программирование Python в парадигме ООП вам помогут курсы DevEducation. Занятия ведут действующие программисты имеющие многолетний опыт за плечами. Обучение программированию на 80 % состоит из решения реальных практических задач, с которыми приходилось или приходится сталкиваться программистам в своей работе.