Объектно-ориентированное программирование. Классы и объекты

Сегодня мы поговорим об объектно-ориентированном программировании и о его применении в python.
Объектно-ориентированное программирование (ООП) — парадигма программирования, в которой основными концепциями являются понятия объектов и классов.
Класс — тип, описывающий устройство объектов. Объект — это экземпляр класса. Класс можно сравнить с чертежом, по которому создаются объекты.
Python соответствует принципам объектно-ориентированного программирования. В python всё является объектами — и строки, и списки, и словари, и всё остальное.
Но возможности ООП в python этим не ограничены. Программист может написать свой тип данных (класс), определить в нём свои методы.
Это не является обязательным — мы можем пользоваться только встроенными объектами. Однако ООП полезно при долгосрочной разработке программы несколькими людьми, так как упрощает понимание кода.
Приступим теперь собственно к написанию своих классов на python. Попробуем определить собственный класс:
Теперь мы можем создать несколько экземпляров этого класса:
File
Классу возможно задать собственные методы:
И напоследок еще один пример:
Для вставки кода на Python в комментарий заключайте его в теги
- Модуль csv - чтение и запись CSV файлов
- Создаём сайт на Django, используя хорошие практики. Часть 1: создаём проект
- Онлайн-обучение Python: сравнение популярных программ
- Книги о Python
- GUI (графический интерфейс пользователя)
- Курсы Python
- Модули
- Новости мира Python
- NumPy
- Обработка данных
- Основы программирования
- Примеры программ
- Типы данных в Python
- Видео
- Python для Web
- Работа для Python-программистов
- Сделай свой вклад в развитие сайта!
- Самоучитель Python
- Карта сайта
- Отзывы на книги по Python
- Реклама на сайте
Объектно-ориентированное программирование
Python имеет множество встроенных типов, например, int, str и так далее, которые мы можем использовать в программе. Но также Python позволяет определять собственные типы с помощью классов . Класс представляет некоторую сущность. Конкретным воплощением класса является объект.
Можно еще провести следующую аналогию. У нас у всех есть некоторое представление о человеке, у которого есть имя, возраст, какие-то другие характеристики Человек может выполнять некоторые действия - ходить, бегать, думать и т.д. То есть это представление, которое включает набор характеристик и действий, можно назвать классом. Конкретное воплощение этого шаблона может отличаться, например, одни люди имеют одно имя, другие - другое имя. И реально существующий человек будет представлять объект этого класса.
Класс определяется с помощью ключевого слова class :
class название_класса: атрибуты_класса методы_класса
Внутри класса определяются его атрибуты, которые хранят различные характеристики класса, и методы - функции класса.
Создадим простейший класс:
class Person: pass
В данном случае определен класс Person, который условно представляет человека. В данном случае в классе не определяется никаких методов или атрибутов. Однако поскольку в нем должно быть что-то определено, то в качестве заменителя функционала класса применяется оператор pass . Этот оператор применяется, когда синтаксически необходимо определить некоторый код, однако мы не хотим его, и вместо конкретного кода вставляем оператор pass.
После создания класса можно определить объекты этого класса. Например:
class Person: pass tom = Person() # определение объекта tom bob = Person() # определение объекта bob
После определения класса Person создаются два объекта класса Person - tom и bob. Для создания объекта применяется специальная функция - конструктор , которая называется по имени класса и которая возвращает объект класса. То есть в данном случае вызов Person() представляет вызов конструктора. Каждый класс по умолчанию имеет конструктор без параметров:
tom = Person() # Person() - вызов конструктора, который возвращает объект класса Person
Методы классов
Методы класса фактически представляют функции, которые определенны внутри класса и которые определяют его поведение. Например, определим класс Person с одним методом:
class Person: # определение класса Person def say_hello(self): print("Hello") tom = Person() tom.say_hello() # Hello
Здесь определен метод say_hello() , который условно выполняет приветствие - выводит строку на консоль. При определении методов любого класса следует учитывать, что все они должны принимать в качестве первого параметра ссылку на текущий объект, который согласно условностям называется self . Через эту ссылку внутри класса мы можем обратиться к функциональности текущего объекта. Но при самом вызове метода этот параметр не учитывается.
Используя имя объекта, мы можем обратиться к его методам. Для обращения к методам применяется нотация точки - после имени объекта ставится точка и после нее идет вызов метода:
объект.метод([параметры метода])
Например, обращение к методу say_hello() для вывода приветствия на консоль:
tom.say_hello() # Hello
В итоге данная программа выведет на консоль строку "Hello".
Если метод должен принимать другие параметры, то они определяются после параметра self , и при вызове подобного метода для них необходимо передать значения:
class Person: # определение класса Person def say(self, message): # метод print(message) tom = Person() tom.say("Hello METANIT.COM") # Hello METANIT.COM
Здесь определен метод say() . Он принимает два параметра: self и message. И для второго параметра - message при вызове метода необходимо передать значение.
self
Через ключевое слово self можно обращаться внутри класса к функциональности текущего объекта:
self.атрибут # обращение к атрибуту self.метод # обращение к методу
Например, определим два метода в классе Person:
class Person: def say(self, message): print(message) def say_hello(self): self.say("Hello work") # обращаемся к выше определенному методу say tom = Person() tom.say_hello() # Hello work
Здесь в одном методе - say_hello() вызывается другой метод - say() :
self.say("Hello work")
Поскольку метод say() принимает кроме self еще параметры (параметр message), то при вызове метода для этого параметра передается значение.
Причем при вызове метода объекта нам обязательно необходимо использовать слово self , если мы его не используем:
def say_hello(self): say("Hello work") # ! Ошибка
То мы столкнемся с ошибкой
Конструкторы
Для создания объекта класса используется конструктор. Так, выше когда мы создавали объекты класса Person, мы использовали конструктор по умолчанию, который не принимает параметров и который неявно имеют все классы:
tom = Person()
Однако мы можем явным образом определить в классах конструктор с помощью специального метода, который называется __init__() (по два прочерка с каждой стороны). К примеру, изменим класс Person, добавив в него конструктор:
class Person: # конструктор def __init__(self): print("Создание объекта Person") def say_hello(self): print("Hello") tom = Person() # Создание объекта Person tom.say_hello() # Hello
Итак, здесь в коде класса Person определен конструктор и метод say_hello() . В качестве первого параметра конструктор, как и методы, также принимает ссылку на текущий объект - self. Обычно конструкторы применяются для определения действий, которые должны производиться при создании объекта.
Теперь при создании объекта:
tom = Person()
будет производится вызов конструктора __init__() из класса Person, который выведет на консоль строку "Создание объекта Person".
Атрибуты объекта
Атрибуты хранят состояние объекта. Для определения и установки атрибутов внутри класса можно применять слово self . Например, определим следующий класс Person:
class Person: def __init__(self, name): self.name = name # имя человека self.age = 1 # возраст человека tom = Person("Tom") # обращение к атрибутам # получение значений print(tom.name) # Tom print(tom.age) # 1 # изменение значения tom.age = 37 print(tom.age) # 37
Теперь конструктор класса Person принимает еще один параметр - name. Через этот параметр в конструктор будет передаваться имя создаваемого человека.
Внутри конструктора устанавливаются два атрибута - name и age (условно имя и возраст человека):
def __init__(self, name): self.name = name self.age = 1
Атрибуту self.name присваивается значение переменной name. Атрибут age получает значение 1.
Если мы определили в классе конструктор __init__, мы уже не сможем вызвать конструктор по умолчанию. Теперь нам надо вызывать наш явным образом опреледеленный конструктор __init__, в который необходимо передать значение для параметра name:
tom = Person("Tom")
Далее по имени объекта мы можем обращаться к атрибутам объекта - получать и изменять их значения:
print(tom.name) # получение значения атрибута name tom.age = 37 # изменение значения атрибута age
В принципе нам необязательно определять атрибуты внутри класса - Python позволяет сделать это динамически вне кода:
class Person: def __init__(self, name): self.name = name # имя человека self.age = 1 # возраст человека tom = Person("Tom") tom.company = "Microsoft" print(tom.company) # Microsoft
Здесь динамически устанавливается атрибут company, который хранит место работы человека. И после установки мы также можем получить его значение. В то же время подобное определение чревато ошибками. Например, если мы попытаемся обратиться к атрибуту до его определения, то программа сгенерирует ошибку:
tom = Person("Tom") print(tom.company) # ! Ошибка - AttributeError: Person object has no attribute company
Для обращения к атрибутам объекта внутри класса в его методах также применяется слово self:
class Person: def __init__(self, name): self.name = name # имя человека self.age = 1 # возраст человека def display_info(self): print(f"Name: Age: ") tom = Person("Tom") tom.display_info() # Name: Tom Age: 1
Здесь определяется метод display_info(), который выводит информацию на консоль. И для обращения в методе к атрибутам объекта применяется слово self: self.name и self.age
Создание объектов
Выше создавался один объект. Но подобным образом можно создавать и другие объекты класса:
class Person: def __init__(self, name): self.name = name # имя человека self.age = 1 # возраст человека def display_info(self): print(f"Name: Age: ") tom = Person("Tom") tom.age = 37 tom.display_info() # Name: Tom Age: 37 bob = Person("Bob") bob.age = 41 bob.display_info() # Name: Bob Age: 41
Здесь создаются два объекта класса Person: tom и bob. Они соответствуют определению класса Person, имеют одинаковый набор атрибутов и методов, однако их состояние будет отличаться.
При выполнении программы Python динамически будет определять self - он представляет объект, у которого вызывается метод. Например, в строке:
tom.display_info() # Name: Tom Age: 37
Это будет объект tom
bob.display_info()
Это будет объект bob
В итоге мы получим следующий консольный вывод:
Name: Tom Age: 37 Name: Bob Age: 41
В чем разница между классом и объектом в python
Подобный вопрос может служить проверкой Ваших знаний терминологии объектно-ориентированного программирования (object oriented programming, сокращенно OOP). Такой же вопрос можно было бы задать в контексте интервью программиста C++, или любой позиции вакансии, которая требует понимания концепции объектов в программировании.
Термины class и object определенно связаны друг с другом, но каждый из них имеет свой отдельный смысл. Начнем с объяснения смысла термина "class" в контексте OOP. Определение class относится к реально написанной части кода, которая используется для определения поведения любого такого класса. Итак, class это статическая часть кода, состоящая из атрибутов, которые не меняются во время выполнения программы - наподобие определений методов класса.
Объект это экземпляр класса. Однако термин object относится к реально существующему экземпляру класса. Каждый объект должен принадлежать классу. Объекты создаются и уничтожаются в программе по мере необходимости, поэтому их время жизни ограничено. Пока объекты "живые", их свойства могут значительно меняться.
Конкретный пример поможет разобраться в том, о чем тут идет речь. Предположим, что у нас есть класс Animal (животное). Все животные имеют тела и мозги - и поэтому они могли бы быть атрибутами нашего вымышленного класса Animal. Также мы можем добавить к классу некоторые методы, которые общие у всех животных - такие как movement (перемещение), потому что все животные могут двигаться. Идея, которую Вы хотите осуществить в своем представлении, состоит в том, что этот очень общий шаблон Animal не изменяется, он просто дает несколько строк кода, которые определяют класс Animal.
Экземпляр класса Animal был бы определенным животным - львом, кошкой или зеброй. Эти экземпляры класса называются объектами. Принимая во внимание, что класс Animal - общее понятие, экземпляры этого класса - львы, коты и т. д. - берут за основу общее понятие класса и создают его реальные экземпляры.
Именно по этой причине программисты определяют конструкторы в своих классах - так происходит всегда, когда они хотят создавать объект с определенными свойствами. Например, какого вида животное должно быть, как его зовут, сколько оно весит и т. д. Так что Вы можете думать о конструкторе объекта как о чем-то таком, которое вводит класс в жизнь программы - отсюда и пошло название constructor, потому что функция конструктора создает определенный экземпляр класса.
У объектов есть понятие "время жизни", а у класса нет. И как ясно показывает наш пример класса Animal, каждый объект в программе имеет связанный с ним интервал времени жизни - кот или зебра не могут жить вечно. И свойства этих объектов могут меняться в течении их "жизни"; если мы определим переменную size в классе Animal, то она может обозначать размер животного (например, размер кота как объекта со временем может расти).
Общее отличие объекта от класса. Можно сказать, что в то время как класс является общей концепцией предметного понятия (наподобие Animal), объект это очень определенное воплощение этого класса, причем с ограниченным временем жизни в программе. Другой способ думать об отличии между классом и объектом - класс предоставляет шаблон для чего-то более специального, которое должен определить программист при создании объекта этого класса.
[Ссылки]
1. In Java, what’s the difference between an object and a class? site:programmerinterview.com.
В чем разница между классом, объектом и экземпляром?
Никак не могу понять, в чём разница между объектом и классом. У меня есть предположение, что класс - это что-то общее, то есть, обширное понятие, а объект - что-то более узкое. Что касается экземпляра и объекта, так я думаю, что это одно и то же. Буду очень благодарен, если вы поможете мне разобраться.
Отслеживать
13.7k 12 12 золотых знаков 43 43 серебряных знака 75 75 бронзовых знаков
задан 11 авг 2018 в 19:55
81 1 1 золотой знак 1 1 серебряный знак 2 2 бронзовых знака
В каком языке используется?
12 авг 2018 в 8:20
@RomanC а что в разных языках программирования понятия класса объекта или же экземпляра разные?
12 авг 2018 в 17:39
Возможный дубликат вопроса: Какая разница между экземпляром и объектом класса?
– user206435
12 авг 2018 в 19:21
@SeeSharp концептуально везде примерно одно и тоже.
13 авг 2018 в 8:55
@Suvitruf я тоже так думаю, тогда к чему первый комментарий?
13 авг 2018 в 9:08
3 ответа 3
Сортировка: Сброс на вариант по умолчанию
Класс - некая абстракция, логическая структура, описывающая поведение и характеристики. Например, машина. Она может ехать, сигналить и т.п.
Объект - конкретный экземпляр класса. Например, конкретная ваша машина.
Экземпляр класса - это одно и тоже, что и объект класса.
| № | Объект | Класс | |:-------------------------------|-----------------------------------------------------:| | 1 | Объект - экземпляр класса | Класс - шаблон, по которому создаются объекты | | 2 | Сущность из реального мира | Группа похожих объектов | | 3 | Физическая сущность | Логическая сущность | | 4 | Объект СОЗДАЁТСЯ | Класс ОПИСЫВАЕТСЯ | | 5 | Объект можно создавать, | Класс определяется единожды | | как правило, много раз | |
Класс: фрукт, Объект: киви, банан, манго.
Отслеживать
ответ дан 11 авг 2018 в 19:57
Suvitruf - Andrei Apanasik Suvitruf - Andrei Apanasik
32.2k 15 15 золотых знаков 61 61 серебряный знак 93 93 бронзовых знака
Разве правильно говорить не характеристики, а состояние?
20 авг 2019 в 10:48
@MikeMclaren у класса нет состояния, состояние только у объектов.
20 авг 2019 в 11:10
А чем тогда отличаются характеристики от состояния?
21 авг 2019 в 8:33
Как правильно подметил пользователь Suvitruf понятия класс и объект очень тесно связаны между собой.
Что такое класс и его экземпляры?
Давайте приведем пример на ситуации из подобного C ЯП C# а далее будет рассмотрен пример из реальной жизни.
class Human
Здесь мы объявили класс . Что же мы сделали объявив класс?? Мы создали шаблон сущности который в дальнейшем мы можем использовать для создания новый экземпляров класса . Вот тут мы зададимся вопросом (которым Вы собственно и задались). А что такое экземпляр класса ?? Это некий конкретный объект который может уже применяться изменяться как Вашей душе угодно. В примере выше, я объявил класс Human . Давайте же сейчас создадим его экземпляр:
Human concret_human = new Human();
Теперь после создания экземпляра класса, мы можем проводить какие либо манипуляции которые возможно применить к данному классу. Какие? Это уже от класса зависит. Проще говоря, класс это некий шаблон, который может использоваться для создания новый объектов или как у бородатых умных дядей экземпляров какого либо класса.
Пример из реальной жизни
Теперь давайте попробуем привести пример из реальной жизни. Вы крупный инженер сотовых телефонов. Что бы сделать новую конкретную модель телефона, Вам нужно иметь шаблон в роли которого в программировании выступает класс. В шаблоне указано что каждый телефон должен звонить, включаться, выключаться и принимать звонки например. И по шаблону мы уже делаем конкретный объект который уже что-то может изменять в себе или использовать по назначению.
Итоги
Давайте подведем итоги.
- Класс - это некий шаблон, который предоставляет абстрактный вид любого объекта.
- Объект или Экземпляр класса - это уже конкретная сущность которая сделана по шаблону класса.