75. Более глубокое изучение классов в Python
Оглавление урока
Введение
В предыдущем уроке мы реализовали два достаточно реалистичных класса и повторили основные концепции ООП в Python. В этом уроке мы немного углубимся в эти концепции и еще раз повторим ранее пройденный материал.
Оператор class
как и def
при выполнении создает объект класса и сохраняет ссылку на него в имени. Как вы помните, Python является интерпретируемым языком и поэтому созданный вами класс не существует до тех пор, пока интерпретатор не достигнет оператора class
и не выполнит его. Обычно это происходит при импортировании модуля с этим классом.
Как мы говорили ранее, класс представляет из себя новое пространство имен. Главным отличием от функций и модулей, является возможность наследования атрибутов и методов из других классов.
Методы
Методы – это те же самые функции, только вложенные в оператор class
и всегда имеющие первый параметр self
. Параметр self
получает экземпляр объекта, относительно которого вызывается метод. Он похож на указатель this
из C++, но в отличие от него, всегда явно указывается. Как вы узнаете в дальнейшем, в Python можно реализовать статические методы, которые не ожидают передачи им экземпляра, а выполняются как обычные локальные функции внутри класса.
Наследование
Еще раз повторим: смысл нового пространства имен, созданного оператором class
, заключается в возможности наследования. Каждый раз, когда вы используете запись объект.атрибут, вы говорите интерпретатору Python о необходимости найти ближайший в дереве пространств имен атрибут с таким именем.
Пространство имен
После изучения объектов классов и экземпляров, мы наконец-то закрываем тему пространств имен в Python. Про область видимости мы говорили в уроке «Область видимости в Python» и неоднократно вспоминали эту тему в последующих уроках. Если кратко подытожить этот материал, то можно прийти к такому выводу: для Python важно где происходит присвоение значения – это определяет область видимости.
Мы также выяснили в уроке «Написание модулей в Python», что пространство имен модулей представляет из себя обычный словарь. Объекты классов и экземпляров тоже реализованы на основе словарей, имеющих связи между собой. За счет этой связи между словарями организуется наследование классов.
Строки документации
Для документирования написанных вами классов и их методов, применяйте пару из трех двойных кавычек после определения имени класса или метода. Вспомним класс User
из предыдущего урока:
''' user.py '''
class User:
""" Регистрация пользователя, изменение имени и рейтинга """
def __init__(self, login, password, name=None, rating=0):
self.login = login
self.password = password
self.name = name
self.rating = rating
…
Строка документации будет добавлена в атрибут __doc__
, которую мы легко можем посмотреть:
''' main.py '''
from user import User
print(User.__doc__)
Сравнение классов и модулей в Python
Модули создаются при помощи файлов с кодом Python или на других языках, реализуют пакеты с логикой, применяются при помощи импортирования и формируют файл верхнего уровня.
Классы создаются при помощи оператора class
, реализуют новый полноценный объект, применяются путем обращения к ним и лежат всегда внутри модуля.
В этом уроке мы еще раз повторили основные концепции ООП в Python, завершили тему области видимости, узнали о возможности документирования классов и методов и еще раз сравнили модули и классы в Python.