Объяснение к уроку
После этого урока ты сможешь:
self.Если ты использовал классы в Java или C#, базовая идея Python покажется тебе знакомой: класс определяет тип объекта, а экземпляр (instance) — это один конкретный объект этого класса. В Python вместо фигурных скобок используются двоеточие и отступы:
class Server:
passПока что pass задает валидное пустое тело класса. Создай объект, вызвав класс по имени: server = Server(). Ты можешь прикреплять поля, называемые атрибутами, прямо к этому экземпляру через точку: server.region = "eu". Два экземпляра могут хранить разные значения, не влияя друг на друга.
Метод — это функция, объявленная внутри класса. Метод экземпляра объявляет self в качестве своего первого параметра. Когда ты вызываешь server.label(), Python автоматически передает server в качестве self. Внутри метода self.region означает регион конкретного объекта, у которого вызван метод. Методы также могут обновлять атрибуты экземпляра.
В этом первом уроке мы присваиваем атрибуты после создания каждого объекта, чтобы наглядно показать объектную модель. В следующем уроке метод __init__ покажет, как инициализировать атрибуты непосредственно при создании объекта. Атрибуты класса и наследование мы разберем позже.
Пустого класса достаточно, чтобы создавать экземпляры и прикреплять к каждому из них разные значения.
class Endpoint:
pass
public = Endpoint()
public.path = "/public"
internal = Endpoint()
internal.path = "/internal"
print(public.path)
print(internal.path)Вывод:
/public
/internalДва атрибута path принадлежат разным объектам.
Один и тот же метод может возвращать разный результат для каждого экземпляра, поскольку self ссылается на вызвавший его объект.
class Printer:
def label(self):
return f"{self.name} ({self.region})"
first = Printer()
first.name = "labels"
first.region = "eu"
print(first.label())Вывод:
labels (eu)Метод использует атрибуты, прикрепленные к first.
Метод может изменить атрибут через self. Это изменение сохранится именно в этом объекте.
class Counter:
def record(self):
self.total += 1
counter = Counter()
counter.total = 0
counter.record()
counter.record()
print(f"Total: {counter.total}")Вывод:
Total: 2Атрибут total был создан до того, как метод record() использовал его. Следующий урок покажет более надежный способ такой настройки.
| Цель | Python |
|---|---|
| Определить класс | class Worker: |
| Сделать пустое тело допустимым | pass |
| Создать экземпляр | worker = Worker() |
| Присвоить атрибут экземпляра | worker.name = "api" |
| Прочитать атрибут | worker.name |
| Определить метод экземпляра | def label(self): |
| Использовать вызвавший объект внутри метода | self.name |
self в методе: обычным методам экземпляра он необходим в качестве первого параметра.self.name, а не просто name, чтобы прочитать атрибут этого экземпляра.first.status не меняет second.status.AttributeError.