Объекты и классы в 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")

Это строка:

  1. выполняет поиск определения класса Cat
  2. инстанцирует (создает) новый объект в памяти
  3. вызывает метод объекта __init__, передавая только что созданный объект self и другой аргумент ("Shrumpy") в качестве значения параметра name
  4. сохраняет в объекте значение переменной name
  5. возвращает новый объект
  6. прикрепляет к объекту переменную furball

name был сохранен как атрибут объекта, поэтому можно к нему обратиться непосредтсвенно:

>>> furball.name
'Shrumpy'
 
>>> furball
<__main__.Cat object at 0x7ff43716e3d0>

Внутри определения класса Cat получаешь доступ к атрибуту name с помощью self.name. А когда создаешь реальный объект и присваиваешь его переменной (furball, например), то ссылаешься на этот атрибут уже как furball.name
Не обязательно иметь метод __init__ для каждого класса - его юзают, чтобы различать объекты одно класса.

В python всё является объектом

Ты можешь создать много отдельных объектов из одного класса. Но помни, что в python данные реализованы как объекты, то есть и сам класс является объектом.
Однако может существовать только один объект для каждого класса, то есть, если класс Cat уже определен, то второй такой класс создать не получится.


Соус: Книга “Простой Python Глава 10. “Ой-ой-ой: объекты и классы

python