Форум программистов, компьютерный форум, киберфорум
Фаер
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  

Python. ООП. Часть 1.

Запись от Фаер размещена 04.11.2012 в 10:32
Показов 5300 Комментарии 0
Метки python, ооп

Думаю, каждый человек, считающий себя программистом, слышал о некоем объектно - ориентированном программировании(ООП). В последнее время данная парадигма усиленно проникает во все сферы разработки ПО, несмотря на то, что приёмы ООП, якобы, снижают производительность программ, в которых используются. Однако с каждым днём компьютеры становятся всё мощнее, и проблема скорости выполнения и использования памяти становится всё менее значимой. На первый план выходит удобство. А ООП сильно упрощает разработку. Отсюда можно сделать совершенно правильный вывод: ООП нужно знать. Вот давайте и узнаем его.

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

Кроме того, следует запомнить такое понятие как класс. Класс - это, грубо говоря, "чистый" объект. Представьте себе таблицу с пустыми полями - это класс. Из этого класса можно взять только форму, трафарет. Заполненная таблица - это уже объект. Из неё можно взять не только поля, но и их содержимое.

Стандартный API Python'а включает в себя множество классов самого разного назначения, и Вы, наверняка, уже пользовались некоторыми из них. Например, все Мы знаем, что такое список(list). Чаще всего он вводится в программу таким образом:
Python
1
sp=[1,5,2]
Однако есть и другой способ создания списка:

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.) - самого объекта, Нам не обойтись.
Но, разумеется, это только пример, методы могут совершать практически любые действия и за пределами характеристик объекта...
Метки python, ооп
Размещено в Без категории
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 0
Комментарии
 
Новые блоги и статьи
Нейросеть на алгоритме "эстафета хвоста" как перспектива.
Hrethgir 06.05.2026
На десерт, когда запущу сервер. Статья тут https:/ / habr. com/ ru/ articles/ 1030914/ . Автор я сам, нейросеть только помогает в вопросах которые мне не известны - не знаю людей которые знали-бы. . .
Асинхронный приём данных из COM-порта
Argus19 01.05.2026
Асинхронный приём данных из COM-порта Купил на aliexpress термопринтер QR701. Он оказался странным. Поключил к Arduino Nano. Был очень удивлён. Наотрез отказывается печатать русские буквы. Чтобы. . .
попытка написать игровой сервер на C++
pyirrlicht 29.04.2026
попытка написать игровой сервер на плюсах с открытым бесконечным миром. возможно получится прикрутить интерпретатор питон для кастомизации игровой логики. что есть на текущий момент:. . .
Контроль уникальности выбранного документа-основания при изменении реквизита
Maks 28.04.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРемонтСпецтехники", разработанного в КА2. Задача: уведомлять пользователя, если указанная заявка (документ-основание). . .
Благородство как наказание
Maks 24.04.2026
У хорошего человека отношения с женщинами всегда складываются трудно. А я человек хороший. Заявляю без тени смущения, потому что гордиться тут нечем. От хорошего человека ждут соответствующего. . .
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2. Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru