Но даже в этом случае второе определение класса Person создает объект, кото-
рый ничего не делает. Наша третья попытка покажет, насколько легко создать
простой объект в Python. В этот раз мы добавим параметр name в метод инициа-
лизации:
>>> class Person():
... def __init__(self, name):
... self.name = name
...
>>>
Теперь мы можем создать объект класса Person, передав строку для параметра
name:
>>> hunter = Person('Elmer Fudd')
Эта строка кода делает следующее:
выполняет поиск определения класса Person;
инстанцирует (создает) новый объект в памяти;
вызывает метод объекта __init__, передавая только что созданный объект под
именем self и другой аргумент ('Elmer Fudd') в качестве значения параметра
name;
сохраняет в объекте значение переменной name;
возвращает новый объект;
прикрепляет к объекту имя hunter.
Этот новый объект похож на любой другой объект Python. Вы можете исполь-
зовать его как элемент списка, кортежа, словаря или множества. Можете передать
его в функцию как аргумент или вернуть его в качестве результата.
Что насчет значения name, которое мы передали? Оно было сохранено как атри-
бут объекта. Вы можете прочитать и записать его непосредственно:
>>> print('The mighty hunter: ', hunter.name)
The mighty hunter: Elmer Fudd
1
Вы встретите множество примеров двойных подчеркиваний в именах Python.
160
Глава 6. Ой-ой-ой: объекты и классы
Помните, внутри определения класса Person вы получаете доступ к атрибуту
name с помощью конструкции self.name. Когда вы создаете реальный объект вроде
hunter, то ссылаетесь на этот атрибут как hunter.name.
Не обязательно иметь метод __init__ в описании каждого класса, он использу-
ется для того, чтобы различать объекты одного класса.
Наследование
Может случиться, что, пытаясь решить какую-то задачу, вы обнаружите, что уже
существует класс, создающий объекты, которые делают почти все из того, что вам
нужно. Что вы можете предпринять? Вы можете модифицировать этот старый
класс, но при этом сделаете его сложнее и можете сломать что-то, что раньше ра-
ботало.
Конечно, можно написать новый класс, скопировав и вставив содержимое ста-
рого класса, а затем дополнить его новым кодом. Но это значит, что вам придется
поддерживать больше кода и части старого и нового классов могут быть непо-
хожими друг на друга, поскольку теперь находятся в разных местах.
Решением проблемы является наследование — создание нового класса из уже
существующего, который при этом содержит какие-то дополнения и изменения.