Продвинутый Python, часть 3: классы и метаклассы
Это завершающая статья цикла «Продвинутый Python», в которой пойдёт речь о классах и метаклассах. В первой части мы познакомились с итераторами, генераторами и модулем itertools, а во второй говорили о замыканиях, декораторах и модуле functools.
Классы как объекты
Посмотрите пример кода, чтобы ближе познакомиться с описанными особенностями.
В некоторых языках, таких как C++, классы можно объявлять только на верхнем уровне модулей. В Python class можно использовать внутри функции. Этот подход можно использовать, чтобы создавать классы на лету. Ниже пример:
Метаклассы
Обратите внимание, второй параметр должен быть кортежем, поэтому синтаксис может выглядеть странно. Если вам нужны методы, создавайте функции и передавайте их как атрибуты. Вот пример:
Можно создавать свои метаклассы: сгодится любой вызываемый (callable) объект, который способен принять три параметра и вернуть объект класса. Такие метаклассы можно применять к классу. Метакласс можно указать при объявлении класса. Давайте рассмотрим этот приём на примере, который заодно продемонстрирует возможности метаклассов:
Как видите, у декораторов и метаклассов есть много общего. Фактически, метаклассы умеют всё, что можно сделать с помощью декоратора класса. Синтаксис декораторов более простой и читабельный, поэтому по возможности следует использовать именно их. Метаклассы умеют больше, так как они запускаются перед созданием класса, а не после, как декораторы. Чтобы убедиться в этом, давайте создадим декоратор и метакласс и посмотрим на порядок исполнения.
Изучайте Python на Хекслете Первые курсы в профессии «Python-программист» доступны бесплатно. Регистрируйтесь и начинайте учиться!
Пример использования метаклассов
Рассмотрим более полезное приложение. Предположим, мы пишем набор классов для обработки ID3v2 тегов, которые используются, например, в MP3-файлах. Подробности можно узнать в «Википедии». Для реализации примера надо понимать, что теги состоят из фреймов. Каждый фрейм содержит четырёхбуквенный идентификатор. Например, TOPE — фрейм имени артиста, TOAL — фрейм названия альбома и так далее. Предположим, нам надо написать класс для каждого типа фреймов. Также нужно дать возможность пользователям библиотеки ID3v2 тегов добавлять собственные классы фреймов для поддержки новых или кастомных фреймов. С помощью метаклассов можно реализовать паттерн «фабрика классов». Это может выглядеть так:
Конечно, задачу можно решить с помощью декораторов классов. Для сравнения посмотрите, как это может выглядеть.
Как видите, можно передавать параметры в декораторы, но не в метаклассы. Если нужно передать параметры в метаклассы, это нужно делать через атрибуты. Поэтому код с декораторами чище и проще в поддержке. Заметьте, что ко времени вызова декоратора класс уже создан. Это значит, что уже поздно менять его свойства, предназначенные только для чтения.
Метаклассы, полученные из type
Подводим итоги
Посмотрим, как Python интерпретирует код выше. Затем посмотрим на вывод, чтобы подтвердить или опровергнуть наши предположения.
Метаклассы на практике
ABCMeta — это метакласс, позволяющий создавать абстрактные базовые классы. Детали смотрите в официальной документации.
Идея djungoplugins основана на статье, в которой описывается простой фреймворк плагинов для Python. Здесь метаклассы используются для создания системы расширений. Автор оригинальной публикации считает, что такой же фреймворк можно создать с помощью декораторов.
Финальный аккорд
Понимание метаклассов помогает досконально разобраться, как ведут себя объекты и классы в Python. Но применение самих метаклассов в реальности может быть сложным, как показано в предыдущем разделе. Практически всё, что можно сделать с помощью метаклассов, можно реализовать и с помощью декораторов. Поэтому прежде чем использовать метаклассы, остановитесь на минуту и подумайте, так ли они необходимы. Если можно обойтись без них, лучше пойти по этому пути. Результат будет более читабельным и простым для поддержки и отладки.
Над адаптированным переводом статьи A Study of Python’s More Advanced Features Part III: Classes and Metaclasses by Sahand Saba работали Алексей Пирогов и Дмитрий Дементий. Мнение автора оригинальной публикации может не совпадать с мнением администрации «Хекслета».
Call type
Смотреть что такое «Call type» в других словарях:
call selection — The attendant can answer calls either in the order in which they arrive or by selecting a specific call type … IT glossary of terms, acronyms and abbreviations
Call of Duty: World at War — North American cover Developer(s) Treyarch Certain Affinity (some multiplayer maps a … Wikipedia
Call signs in North America — are frequently still used by North American broadcast stations in addition to amateur radio and other international radio stations that continue to identify by call signs around the world. Each country has a different set of patterns for its own… … Wikipedia
Call-girl — Une cabine téléphonique londonienne dont la paroi est tapissée de cartes de call girls. Une call girl ou escort girl[1] … Wikipédia en Français
Call TV (Québec) — Call TV Genre Infopublicité/Jeu télévisé Périodicité Diffusion en direct Réalisation TM Products GesmbH et Mass Response Service GmbH, Autriche Présentation Sandra Sirois et Karl Hardy Ancienne présentation Evelyne Audet (2009), Geneviève Meunier … Wikipédia en Français
Type system — Type systems Type safety Inferred vs. Manifest Dynamic vs. Static Strong vs. Weak Nominal vs. Structural Dependent typing Duck typing Latent typing Linear typing Uniqueness typing … Wikipedia
Call of Duty: World at War — Call of Duty 5 Разработчик Treyarch Издатель … Википедия
Call of Duty: Black Ops — Call of Duty Black Ops Éditeur Activision Square Enix (Japon) Développeur Tr … Wikipédia en Français
Call Of Duty 2 — Éditeur Activision Développeur Infinity Ward … Wikipédia en Français
Call Of Duty 4 : Modern Warfare — Call of Duty 4: Modern Warfare Call of Duty 4 Modern Warfare Éditeur Activision Développeur Infinity … Wikipédia en Français
Call of Duty 4 — Call of Duty 4: Modern Warfare Call of Duty 4 Modern Warfare Éditeur Activision Développeur Infinity … Wikipédia en Français
Инстанцирование в Python
Допустим, у вас есть класс Foo :
Что происходит, когда вы создаёте его объект?
Какой метод вызывается первым при этом вызове Foo? Большинство новичков, да и, возможно, немало опытных питонистов тут же ответят: «метод __init__». Но если внимательно приглядеться к сниппетам выше, вскоре станет понятно, что такой ответ неверен.
__init__ не возвращает никакого результата, а Foo(1, y=2), напротив, возвращает экземпляр класса. К тому же __init__ принимает self в качестве первого параметра, чего не происходит при вызове Foo(1, y=2). Создание экземпляра происходит немного сложнее, о чём мы и поговорим в этой статье.
Порядок создания объекта
Инстанцирование в Python состоит из нескольких стадий. Понимание каждого шага делает нас чуть ближе к пониманию языка в целом. Foo — это класс, но в Питоне классы это тоже объекты! Классы, функции, методы и экземпляры — всё это объекты, и всякий раз, когда вы ставите скобки после их имени, вы вызываете их метод __call__. Так что Foo(1, y=2) — это эквивалент Foo.__call__(1, y=2). Причём метод __call__ объявлен в классе объекта Foo. Какой же класс у объекта Foo?
Так что класс Foo — это экземпляр класса type и вызов метода __call__ последнего возвращает класс Foo. Теперь давайте разберём, что из себя представляет метод __call__ класса type. Ниже находятся его реализации на C в CPython и в PyPy. Если надоест их смотреть, прокручивайте чуть дальше, чтобы найти упрощённую версию:
CPython
Если забыть про всевозможные проверки на ошибки, то коды выше примерно эквивалентны такому:
__new__ выделяет память под «пустой» объект и вызывает __init__, чтобы его инициализировать.
Кастомизация
Теперь давайте переключим наше внимание на __new__. Этот метод выделяет память под объект и возвращает его. Вы вольны кастомизировать этот процесс множеством разных способов. Следует отметить, что, хотя __new__ и является статическим методом, вам не нужно объявлять его используя @staticmethod: интерпретатор обрабатывает __new__ как специальный случай.
Распространённый пример переопределения __new__ — создание Синглтона:
Обратите внимание, что __init__ будет вызываться каждый раз при вызове Singleton(), поэтому следует соблюдать осторожность.
Другой пример переопределения __new__ — реализация паттерна Борг («Borg»):
Учтите, что хотя примеры выше и демонстрируют возможности переопределения __new__, это ещё не значит что его обязательно нужно использовать:
__new__ — одна из самых частых жертв злоупотреблений. То, что может быть сделано переопределением этого метода, чаще всего лучше достигается другими средствами. Тем не менее, когда это действительно необходимо, __new__ — крайне полезный и мощный инструмент.
Редко можно встретить проблему в Python, где лучшим решением было использование __new__. Но когда у вас есть молоток, каждая проблема начинает выглядеть как гвоздь, поэтому всегда предпочитайте использованию нового мощного инструмента использование наиболее подходящего.
call type
1 call type
тип обращения
(ITIL Service Operation)
Категория, которая используется для различения поступающих в службу поддержки пользователей запросов. Обычные типы обращений – инцидент, запрос на обслуживание и жалоба.
[Словарь терминов ITIL версия 1.0, 29 июля 2011 г.]
call type
(ITIL Service Operation)
A category that is used to distinguish incoming requests to a service desk. Common call types are incident, service request and complaint.
[Словарь терминов ITIL версия 1.0, 29 июля 2011 г.]
Тематики
2 Call type
3 call-type
4 call-type
См. также в других словарях:
call selection — The attendant can answer calls either in the order in which they arrive or by selecting a specific call type … IT glossary of terms, acronyms and abbreviations
Call of Duty: World at War — North American cover Developer(s) Treyarch Certain Affinity (some multiplayer maps a … Wikipedia
Call signs in North America — are frequently still used by North American broadcast stations in addition to amateur radio and other international radio stations that continue to identify by call signs around the world. Each country has a different set of patterns for its own… … Wikipedia
Call-girl — Une cabine téléphonique londonienne dont la paroi est tapissée de cartes de call girls. Une call girl ou escort girl[1] … Wikipédia en Français
Call TV (Québec) — Call TV Genre Infopublicité/Jeu télévisé Périodicité Diffusion en direct Réalisation TM Products GesmbH et Mass Response Service GmbH, Autriche Présentation Sandra Sirois et Karl Hardy Ancienne présentation Evelyne Audet (2009), Geneviève Meunier … Wikipédia en Français
Type system — Type systems Type safety Inferred vs. Manifest Dynamic vs. Static Strong vs. Weak Nominal vs. Structural Dependent typing Duck typing Latent typing Linear typing Uniqueness typing … Wikipedia
Call of Duty: World at War — Call of Duty 5 Разработчик Treyarch Издатель … Википедия
Call of Duty: Black Ops — Call of Duty Black Ops Éditeur Activision Square Enix (Japon) Développeur Tr … Wikipédia en Français
Call Of Duty 2 — Éditeur Activision Développeur Infinity Ward … Wikipédia en Français
Call Of Duty 4 : Modern Warfare — Call of Duty 4: Modern Warfare Call of Duty 4 Modern Warfare Éditeur Activision Développeur Infinity … Wikipédia en Français
Call of Duty 4 — Call of Duty 4: Modern Warfare Call of Duty 4 Modern Warfare Éditeur Activision Développeur Infinity … Wikipédia en Français
call type
тип обращения
(ITIL Service Operation)
Категория, которая используется для различения поступающих в службу поддержки пользователей запросов. Обычные типы обращений – инцидент, запрос на обслуживание и жалоба.
[Словарь терминов ITIL версия 1.0, 29 июля 2011 г.]
call type
(ITIL Service Operation)
A category that is used to distinguish incoming requests to a service desk. Common call types are incident, service request and complaint.
[Словарь терминов ITIL версия 1.0, 29 июля 2011 г.]
Тематики
Смотреть что такое «call type» в других словарях:
call selection — The attendant can answer calls either in the order in which they arrive or by selecting a specific call type … IT glossary of terms, acronyms and abbreviations
Call of Duty: World at War — North American cover Developer(s) Treyarch Certain Affinity (some multiplayer maps a … Wikipedia
Call signs in North America — are frequently still used by North American broadcast stations in addition to amateur radio and other international radio stations that continue to identify by call signs around the world. Each country has a different set of patterns for its own… … Wikipedia
Call-girl — Une cabine téléphonique londonienne dont la paroi est tapissée de cartes de call girls. Une call girl ou escort girl[1] … Wikipédia en Français
Call TV (Québec) — Call TV Genre Infopublicité/Jeu télévisé Périodicité Diffusion en direct Réalisation TM Products GesmbH et Mass Response Service GmbH, Autriche Présentation Sandra Sirois et Karl Hardy Ancienne présentation Evelyne Audet (2009), Geneviève Meunier … Wikipédia en Français
Type system — Type systems Type safety Inferred vs. Manifest Dynamic vs. Static Strong vs. Weak Nominal vs. Structural Dependent typing Duck typing Latent typing Linear typing Uniqueness typing … Wikipedia
Call of Duty: World at War — Call of Duty 5 Разработчик Treyarch Издатель … Википедия
Call of Duty: Black Ops — Call of Duty Black Ops Éditeur Activision Square Enix (Japon) Développeur Tr … Wikipédia en Français
Call Of Duty 2 — Éditeur Activision Développeur Infinity Ward … Wikipédia en Français
Call Of Duty 4 : Modern Warfare — Call of Duty 4: Modern Warfare Call of Duty 4 Modern Warfare Éditeur Activision Développeur Infinity … Wikipédia en Français
Call of Duty 4 — Call of Duty 4: Modern Warfare Call of Duty 4 Modern Warfare Éditeur Activision Développeur Infinity … Wikipédia en Français




