Думаю, каждый человек, считающий себя программистом, слышал о некоем объектно - ориентированном программировании(ООП). В последнее время данная парадигма усиленно проникает во все сферы разработки ПО, несмотря на то, что приёмы ООП, якобы, снижают производительность программ, в которых используются. Однако с каждым днём компьютеры становятся всё мощнее, и проблема скорости выполнения и использования памяти становится всё менее значимой. На первый план выходит удобство. А ООП сильно упрощает разработку. Отсюда можно сделать совершенно правильный вывод: ООП нужно знать. Вот давайте и узнаем его.
Основное понятие объектно - ориентированного программирования это, конечно же, объект. Под словом "объект" Мы будем понимать нечто, обозначенное одной переменной, имеющее определённые параметры, или, если угодно, величины, и обладающее поведением, определённым функциями и процедурами(более научные объяснения найти не трудно, если Вам такое не по душе).
Кроме того, следует запомнить такое понятие как класс. Класс - это, грубо говоря, "чистый" объект. Представьте себе таблицу с пустыми полями - это класс. Из этого класса можно взять только форму, трафарет. Заполненная таблица - это уже объект. Из неё можно взять не только поля, но и их содержимое.
Стандартный API Python'а включает в себя множество классов самого разного назначения, и Вы, наверняка, уже пользовались некоторыми из них. Например, все Мы знаем, что такое список(list). Чаще всего он вводится в программу таким образом:
Однако есть и другой способ создания списка:
| Python | 1
| sp=list((1,5,2))#двойные скобки означают, что передаётся один объект - кортеж |
|
Где list() - это как бы форма, а (1,5,2) - данные, которые в эту форму записываются. Отсюда следует, что список - это класс, в чём можно легко убедиться, написав в Python'е команду
| Python | 1
| help(list)# в результате Вы получите описание класса list |
|
Полученный Нами список sp - это экземпляр класса list.
Если Вы написали команду help(list), то должно быть обратили внимание на то, что в описании данного класса имеется множество строк, напоминающих команды вызова подпрограмм, только без аргументов. Так оно и есть: каждый класс содержит в себе несколько функций, которые определяют его поведение. Эти самые функции назваются методами. Класс без методов - это просто набор данных, с которыми ничего нельзя сделать. Давайте сделаем такой набор данных, чтобы начать с начала начал:
| Python | 1
2
3
4
5
| class car:
def __init__(self,name,color,speed=200):
self.name=name
self.color=color
self.speed=speed |
|
Данный класс содержит в себе только один метод __init__() - конструктор. В скобках Мы описываем характеристики, присущие экземплярам класса car(). Набор характеристик объекта называется абстракцией. Возможно у Вас возник совершенно уместный вопрос: что такое self? Это есть самая сущность класса(достаточно вспомнить, что вставка self(yourself,herself) это эквивалент русской -ся, что означает "себя"(умываться = умывать себя)). Для большей наглядности, в этом же скрипте напишите:
| Python | 1
2
3
4
| a=car('Audi','Green')#это инстанцирование - создание экземпляра класса
a.name #если запускаете скрипт через консоль, пишите print(a.name)
a.name='BMW'
a.name |
|
Третья строка очень похожа на строку self.name=name. Это она и есть. Разница состоит в том, что когда Мы описываем класс, Мы не имеем непосредственно объекта, только форму, с помощью которой его можно сконструировать, а значит в Нашем распоряжении есть только "безликий" self. А вот после ввода строки a=car('Audi','Green') Мы имеем самый настоящий объект и self заменяется переменной, ссылающейся на экземпляр класса(в Нашем случае это переменная a). Заметьте, что при конструировании было передано только два аргумента, тогда как функция __init__ принимает целых четыре. self, как Мы узнали, это a - переменная, ссылающаяся на создаваемый Нами экземпляр класса car. Два следующих аргумента переданы вполне добросовестно: объект a приобрёл два параметра - name и color. Однако, он так же имеет и третий параметр - speed. Дело в том, что ещё описывая сам класс, Мы установили значение по умолчанию: speed=200. Если при инстанцировании аргумент, в Нашем случае третий, не был передан, ему присваивается значение, указанное в строке def __init__():, при условии, что оно там имеется. Если же его там нет, Вы получите ошибку типа:
| Python | 1
| TypeError: __init__() takes at least 3 arguments (2 given) |
|
так что будьте осторожней. Аргументы, имеющие значение по умолчанию, должны быть описаны в строке def __init__(): в последнюю очередь. Не забывайте об этом!
Теперь давайте напишем метод класса:
| Python | 1
2
3
4
5
6
7
8
9
10
11
12
| class car:
def __init__(self,name,color,speed=200):
self.name=name
self.color=color
self.speed=speed
def accelerate(self,nspeed):
self.speed+=nspeed
a=car('Audi','Red',100)
a.speed
a.accelerate(50)
a.speed |
|
accelerate - метод класса car, который, принимая сторонний аргумент nspeed, увеличивает параметр a.speed на только что принятую величину(на всякий случай замечу, что a+=1 это то же самое, что a=a+1). Как видите, Мы передали методу не только nspeed, но и self. Ведь Нам нужно изменить не просто переменную, а привязанный к объекту параметр, следовательно без self(a.) - самого объекта, Нам не обойтись.
Но, разумеется, это только пример, методы могут совершать практически любые действия и за пределами характеристик объекта...
|