Классы в питоне

Сегодня мы поговорим об объектно-ориентированном программировании и о его применении в python.

Объектно-ориентированное программирование (ООП) — парадигма программирования, в которой основными концепциями являются понятия объектов и классов.

Класс — тип, описывающий устройство объектов. Объект — это экземпляр класса. Класс можно сравнить с чертежом, по которому создаются объекты.

Python соответствует принципам объектно-ориентированного программирования. В python всё является объектами — и строки, и списки, и словари, и всё остальное.

Но возможности ООП в python этим не ограничены. Программист может написать свой тип данных (класс), определить в нём свои методы.

Это не является обязательным — мы можем пользоваться только встроенными объектами. Однако ООП полезно при долгосрочной разработке программы несколькими людьми, так как упрощает понимание кода.

Приступим теперь собственно к написанию своих классов на python. Попробуем определить собственный класс:

>>> # Пример простейшего класса, который ничего не делает… classA:… pass

Теперь мы можем создать несколько экземпляров этого класса:

>>> a=A()>>> b=A()>>> a.arg=1# у экземпляра a появился атрибут arg, равный 1>>> b.arg=2# а у экземпляра b — атрибут arg, равный 2>>> print(a.arg)1 >>> print(b.arg)2 >>> c=A()>>> print(c.arg)# а у этого экземпляра нет argTraceback (most recent call last): File «<stdin>», line 1, in <module>AttributeError: ‘A’ object has no attribute ‘arg’

Классу возможно задать собственные методы:

>>> classA:… defg(self):# self — обязательный аргумент, содержащий в себе экземпляр… # класса, передающийся при вызове метода,… # поэтому этот аргумент должен присутствовать… # во всех методах класса…. return’hello world’…>>> a=A()>>> a.g()’hello world’

И напоследок еще один пример:

>>> classB:… arg=’Python’# Все экземпляры этого класса будут иметь атрибут arg,…

# равный «Python»… # Но впоследствии мы его можем изменить… defg(self):… returnself.arg…>>> b=B()>>> b.g()’Python’ >>> B.g(b)’Python’ >>> b.arg=’spam’>>> b.g()’spam’

Объектно-ориентированное программирование

Классы и объекты

Последнее обновление: 06.07.2018

Python поддерживает объектно-ориентированную парадигму программирования, а это значит, что мы можем определить компоненты программы в виде классов.

Класс является шаблоном или формальным описанием объекта, а объект представляет экземпляр этого класса, его реальное воплощение. Можно провести следующую аналогию: у всех у нас есть некоторое представление о человеке — наличие двух рук, двух ног, головы, пищеварительной, нервной системы, головного мозга и т.д. Есть некоторый шаблон — этот шаблон можно назвать классом. Реально же существующий человек (фактически экземпляр данного класса) является объектом этого класса.

С точки зрения кода класс объединяет набор функций и переменных, которые выполняют определенную задачу. Функции класса еще называют методами. Они определяют поведение класса. А переменные класса называют атрибутами- они хранят состояние класса

Класс определяется с помощью ключевого слова class:

class название_класса: методы_класса

Для создания объекта класса используется следующий синтаксис:

название_объекта = название_класса([параметры])

Например, определим простейший класс Person, который будет представлять человека:

class Person: name = «Tom» def display_info(self): print(«Привет, меня зовут», self.name) person1 = Person() person1.display_info() # Привет, меня зовут Tom person2 = Person() person2.name = «Sam» person2.display_info() # Привет, меня зовут Sam

Класс Person определяет атрибут name, который хранит имя человека, и метод display_info, с помощью которого выводится информация о человеке.

При определении методов любого класса следует учитывать, что все они должны принимать в качестве первого параметра ссылку на текущий объект, который согласно условностям называется self (в ряде языков программирования есть своего рода аналог — ключевое слово this). Через эту ссылку внутри класса мы можем обратиться к методам или атрибутам этого же класса.

В частности, через выражение можно получить имя пользователя.

После определения класс Person создаем пару его объектов — person1 и person2. Используя имя объекта, мы можем обратиться к его методам и атрибутам. В данном случае у каждого из объектов вызываем метод , который выводит строку на консоль, и у второго объекта также изменяем атрибут name. При этом при вызове метода display_info не надо передавать значение для параметра self.

Конструкторы

Для создания объекта класса используется конструктор. Так, выше когда мы создавали объекты класса Person, мы использовали конструктор по умолчанию, который неявно имеют все классы:

person1 = Person() person2 = Person()

Однако мы можем явным образом определить в классах конструктор с помощью специального метода, который называется __init(). К примеру, изменим класс Person, добавив в него конструктор:

class Person: # конструктор def __init__(self, name): self.name = name # устанавливаем имя def display_info(self): print(«Привет, меня зовут», self.name) person1 = Person(«Tom») person1.display_info() # Привет, меня зовут Tom person2 = Person(«Sam») person2.display_info() # Привет, меня зовут Sam

В качестве первого параметра конструктор также принимает ссылку на текущий объект — self. Нередко в конструкторах устанавливаются атрибуты класса. Так, в данном случае в качестве второго параметра в конструктор передается имя пользователя, которое устанавливается для атрибута . Причем для атрибута необязательно определять в классе переменную name, как это было в предыдущей версии класса Person.

Установка значения уже неявно создает атрибут name.

person1 = Person(«Tom») person2 = Person(«Sam»)

В итоге мы получим следующий консольный вывод:

Привет, меня зовут Tom Привет, меня зовут Sam

Деструктор

После окончания работы с объектом мы можем использовать оператор del для удаления его из памяти:

person1 = Person(«Tom») del person1 # удаление из памяти # person1.display_info() # Этот метод работать не будет, так как person1 уже удален из памяти

Стоит отметить, что в принципе это необязательно делать, так как после окончания работы скрипта все объекты автоматически удаляются из памяти.

Кроме того, мы можем определить определить в классе деструктор, реализовав встроенную функцию __del__, который будет вызываться либо в результате вызова оператора del, либо при автоматическом удалении объекта. Например:

class Person: # конструктор def __init__(self, name): self.name = name # устанавливаем имя def __del__(self): print(self.name,»удален из памяти») def display_info(self): print(«Привет, меня зовут», self.name) person1 = Person(«Tom») person1.display_info() # Привет, меня зовут Tom del person1 # удаление из памяти person2 = Person(«Sam») person2.display_info() # Привет, меня зовут Sam

Консольный вывод:

Привет, меня зовут Tom Tom удален из памяти Привет, меня зовут Sam Sam удален из памяти

Определение классов в модулях и подключение

Как правило, классы размещаются в отдельных модулях и затем уже импортируются в основой скрипт программы. Пусть у нас будет в проекте два файла: файл main.py (основной скрипт программы) и classes.py (скрипт с определением классов).

В файле classes.py определим два класса:

class Person: # конструктор def __init__(self, name): self.name = name # устанавливаем имя def display_info(self): print(«Привет, меня зовут», self.name) class Auto: def __init__(self, name): self.name = name def move(self, speed): print(self.name, «едет со скоростью», speed, «км/ч»)

В дополнение к классу Person здесь также определен класс Auto, который представляет машину и который имеет метод move и атрибут name. Подключим эти классы и используем их в скрипте main.py:

from classes import Person, Auto tom = Person(«Tom») tom.display_info() bmw = Auto(«BMW») bmw.move(65)

Подключение классов происходит точно также, как и функций из модуля. Мы можем подключить весь модуль выражением:

import classes

Либо подключить отдельные классы, как в примере выше.

В итоге мы получим следующий консольный вывод:

Привет, меня зовут Tom BMW едет со скоростью 65 км/ч

НазадСодержаниеВперед

Как и в предыдущих ответах, стоит упомянуть о существовании который содержит несколько абстрактных базовых классов (ABC), которые дополняют утиную печать.

Например, вместо явной проверки, есть ли что-то в списке:

вы могли бы, если вам интересно только, если объект, который у вас есть, позволяет получать предметы, используйте :

если вас строго интересуют объекты, которые позволяют получать, устанавливать и удалять элементы (т. е. изменяемые последовательности), вы бы выбрали .

Здесь определены многие другие ABC, объектов, которые могут использоваться как карты, , и т. Д. Полный список из них можно увидеть в документации для .

На экземплярах объекта вы также имеете:

атрибут. Вот пример, взятый из консоли Python 3.3

Опасайтесь, что в классах python 3.x и в классах нового стиля (возможно, из Python 2.6) класс и тип были объединены, и это может привести к неожиданным результатам.

В основном по этой причине мой любимый способ тестирования типов / классов — это встроенная функция isinstance .

Вы можете использовать или .

Будьте предупреждены, что вы можете использовать clobber или любой другой тип, назначая переменную в текущей области с тем же именем.

Выше мы видим, что переназначается в строку, поэтому тест:

… не получается.

Чтобы обойти это и использовать более осторожно:

Добавить комментарий

Закрыть меню