Глава 9 • Классы
Метод
__init__()
определяется с тремя параметрами:
self
,
name
и
age
. Пара-
метр
self
обязателен в определении метода; он должен предшествовать всем
остальным параметрам. Он должен быть включен в определение для того, чтобы
при будущем вызове метода
__init__()
(для создания экземпляра
Dog
) автомати-
чески передавался аргумент
self
. При каждом вызове метода, связанного с клас-
сом, автоматически передается
self
— ссылка на экземпляр; она предоставляет
конкретному экземпляру доступ к атрибутам и методам класса. Когда вы создаете
экземпляр
Dog
, Python вызывает метод
__init__()
из класса
Dog
. Мы передаем
Dog()
кличку и возраст в аргументах; значение
self
передается автоматически, так
что его передавать не нужно. Каждый раз, когда вы захотите создать экземпляр
на основе класса
Dog
, необходимо предоставить значения только двух последних
аргументов
name
и
age
.
Каждая из двух переменных, определяемых в точке
, имеет префикс
self
. Лю-
бая переменная с префиксом
self
доступна для каждого метода в классе, и вы
также сможете обращаться к этим переменным в каждом экземпляре, созданном
на основе класса. Конструкция
self.name
=
name
берет значение, хранящееся
в параметре
name
, и сохраняет его в переменной
name
, которая затем связыва-
ется с создаваемым экземпляром. Процесс также повторяется с
self.age
=
age
.
Переменные, к которым вы обращаетесь через экземпляры, тоже называются
атрибутами.
В классе
Dog
также определяются два метода:
sit()
и
roll_over()
. Так как
этим методам не нужна дополнительная информация (кличка или возраст), они
определяются с единственным параметром
self
. Экземпляры, которые будут
созданы позднее, смогут вызывать эти методы. Пока методы
sit()
и
roll_over()
ограничиваются простым выводом сообщения о том, что собака садится или
перекатывается. Тем не менее концепцию легко расширить для практического
применения: если бы этот класс был частью компьютерной игры, то эти методы
вполне могли бы содержать код для создания анимации садящейся или пере-
катывающейся собаки. А если бы класс был написан для управления роботом,
то методы могли бы управлять механизмами, заставляющими робота-собаку
выполнить соответствующую команду.
Создание классов в Python 2 .7
При создании классов в Python 2.7 необходимо внести одно незначительное из-
менение — заключить в круглые скобки ключевое слово
object
:
class ClassName(object):
...
В этом случае поведение классов Python 2.7 будет приближено к поведению клас-
сов Python 3, что упрощает вашу работу в целом.
Скажем, в Python 2.7 класс
Dog
будет определяться следующим образом:
class Dog(object):
...
Создание и использование класса
163
Создание экземпляра класса
Считайте, что класс — это своего рода инструкция по созданию экземпляров. Со-
ответственно, класс
Dog
— инструкция по созданию экземпляров, представляющих
конкретных собак.
Создадим экземпляр, представляющий конкретную собаку:
class Dog():
...
my_dog = Dog('willie', 6)
print("My dog's name is " + my_dog.name.title() + ".")
print("My dog is " + str(my_dog.age) + " years old.")
Использованный в данном случае класс
Dog
был написан в предыдущем при-
мере. В точке
мы приказываем Python создать экземпляр собаки с кличкой
'willie'
и возрастом 6. В процессе обработки этой строки Python вызывает ме-
тод
__init__()
класса
Dog
с аргументами
'willie'
и 6. Метод
__init__()
создает
экземпляр, представляющий конкретную собаку, и присваивает его атрибутам
name
и
age
переданные значения. Метод
__init__()
не содержит явной команды
return
,
но Python автоматически возвращает экземпляр, представляющий собаку. Этот
экземпляр сохраняется в переменной
my_dog
. Здесь нелишне вспомнить соглаше-
ния по записи имен: обычно считается, что имя, начинающееся с символа верхнего
регистра (например,
Dog
), обозначает класс, а имя, записанное в нижнем регистре
(например,
my_dog
), обозначает отдельный экземпляр, созданный на базе класса.
Обращение к атрибутам
Для обращения к атрибутам экземпляра используется «точечная» запись. В стро-
ке
мы обращаемся к значению атрибута
name
экземпляра
my_dog
:
my_dog.name
Точечная запись часто используется в Python. Этот синтаксис показывает, как
Python ищет значения атрибутов. В данном случае Python обращается к экзем-
пляру
my_dog
и ищет атрибут
name
, связанный с экземпляром
my_dog
. Это тот же
атрибут, который обозначался
self.name
в классе
Dog
. В точке
тот же прием ис-
пользуется для работы с атрибутом
age
. В первой команде
print
вызов
my_dog.name.
title()
записывает
'willie'
(значение атрибута
name
экземпляра
my_dog
) с символа
верхнего регистра. Во второй команде
print
вызов
str(my_dog.age)
преобразует 6,
значение атрибута
age
экземпляра
my_dog
, в строку.
Пример выводит сводку известных фактов о
my_dog
:
My dog's name is Willie.
My dog is 6 years old.
Вызов методов
После создания экземпляра на основе класса
Dog
можно применять точечную за-
пись для вызова любых методов, определенных в
Dog
:
164
Достарыңызбен бөлісу: |