Объекты и классы в python
Объекты
Объекты — пользовательская структура данных, содержащая как данные (переменные, называемые атрибутами класса), так и код (функции, называемые методами класса).
Создание новых объектов
Чтобы создать объект, нужно сначала создать класс, который укажет, что в объекте содержится. Создается новый класс ключевым словом class.
Для примера создаю пустой класс (как самый простой пример):
class Cat():
pass
# можно и без скобок:
class Cat:
passА создать объект из класса можно так:
a_cat = Cat()
another_cat = Cat()In this case создадутся два отдельных объекта класса Cat с именами a_cat и another_cat.
Атрибуты
Атрибут — переменная внутри класса/объекта. Во время и после создания класса/объекта можно им просвоить атрибуты. Атрибутом может быть любой другой объект.
По умолчанию, вывод объектов на экран такой (ибо при создании класса ты не указывал в каком виде ему выводиться):
>>> a_cat
<__main__.Cat object at 0x7f8635581a90>Задать атрибуты объекту можно так:
a_cat.age = 3
a_cat.name = "Schlawg"
a_cat.enemy = another_cat
a_cat.enemy.name = "Zawg" # задание атрибута объекту another_catА получить к ним доступ:
>>> a_cat.age
3
>>> a_cat.name
'Schlawg'
>>> a_cat.enemy
<__main__.Cat object at 0x7ff435aeee90>
>>> a_cat.enemy.name
'Zawg'Методы
Метод — функция класса/объекта.
Инициализация объекта
Если нужно присвоить артибуты объекту во время его создания, юзай специальный метод инициализации
__init__(обычная функция). Его следует рассматривать, как средство инициализации.
class Cat():
def __init__(self):
pass
__init__— особое имя метода, который инициализирует отдельный объект с помощью определения его класса. А аргументselfпросто указывает на сам объект. Когда указываешь__init__в определении класса, его первым параметром должен быть объект с именемself.self, кстати, не является в Python зарезервированным словом, но юзают часто.
В коде выше второе определение класса Cat создает объект, который ничего не делает, поэтому добавь в него параметр какой-нибудь:
class Cat():
def __init__(self, name):
self.name = nameТеперь можно создать объект класса Cat и сразу передать ему строку для параметра name:
furball = Cat("Shrumpy")Это строка:
- выполняет поиск определения класса
Cat - инстанцирует (создает) новый объект в памяти
- вызывает метод объекта
__init__, передавая только что созданный объектselfи другой аргумент("Shrumpy")в качестве значения параметраname - сохраняет в объекте значение переменной
name - возвращает новый объект
- прикрепляет к объекту переменную
furball
name был сохранен как атрибут объекта, поэтому можно к нему обратиться непосредтсвенно:
>>> furball.name
'Shrumpy'
>>> furball
<__main__.Cat object at 0x7ff43716e3d0>Внутри определения класса
Catполучаешь доступ к атрибутуnameс помощьюself.name. А когда создаешь реальный объект и присваиваешь его переменной (furball, например), то ссылаешься на этот атрибут уже какfurball.nameНе обязательно иметь метод__init__для каждого класса — его юзают, чтобы различать объекты одно класса.
В python всё является объектом
Ты можешь создать много отдельных объектов из одного класса. Но помни, что в python данные реализованы как объекты, то есть и сам класс является объектом. Однако может существовать только один объект для каждого класса, то есть, если класс
Catуже определен, то второй такой класс создать не получится.
Соус: Книга “Простой Python” → Глава 10. “Ой-ой-ой: объекты и классы”