Язык программирования Python

Как работают метаклассы в Python

В этой статье будет дано краткое описание того, что мы понимаем под метаклассом в Python, и показано несколько примеров их использования. Прежде чем мы перейдем непосредственно к материалу, я хотел бы отметить важный момент, касающийся классов Python, который облегчит нам понимание концепции метаклассов.

Является ли класс объектом в Python?

Если вы уже программировали на каком-либо другом языке программирования, кроме Python, то, скорее всего, вы понимаете, что такое классы, как способ создания новых объектов. Это верно и для Python, но Python делает шаг дальше, поскольку объекты также считаются классами!

Итак, если вы создали следующий класс в Python:

class myClass(object): pass

Это означает, что в памяти был создан объект с именем myClass. Поскольку этот объект способен создавать новые объекты, он считается классом. Это означает, что мы можем применять объектные операции к классам в Python, поскольку классы сами являются объектами.

Вот почему мы можем выполнять операции над классами. Например, присвоить класс переменной следующим образом:

class_object = myClass() print class_object
Code language: PHP (php)

Который вернет:

< __main__.myClass object at 0x102623610 >
Code language: HTML, XML (xml)

Вы даже можете передать классу myClass в качестве параметра в метод, как это сделано ниже:

def class_object(object): print object class_object(myClass)
Code language: PHP (php)

Что вернет следующее:

< class '__main__.myClass' >
Code language: HTML, XML (xml)

Метаклассы

Вы, вероятно, уже сталкивались с ключевым словом type в Python. Скорее всего, вы уже использовали его для проверки типа объекта, как показано в следующих примерах:

print type('jorge') print type(100) print type(100.0) print type(int)
Code language: PHP (php)

В этом случае вы получите следующее:

< type 'str' > < type 'int' > < type 'float' > < type 'type' >
Code language: HTML, XML (xml)

Что касается результатов вывода, все кажется довольно понятным, пока мы не дойдем до типа type. Чтобы понять, что именно это может означать, давайте вернемся к классу, который мы определили в начале статьи:

class myClass(object): pass

Далее мы делаем следующее:

print type(myClass)
Code language: PHP (php)

Что мы получаем в результате?

< type 'type' >
Code language: HTML, XML (xml)

Поэтому можно сделать вывод, что тип классов Python – type.

Какова связь между типом и метаклассом?

Что ж, тип является метаклассом, если метакласс по умолчанию является типом. Я знаю, что это может сбить с толку. Этот тип можно использовать для возврата класса объекта, как показано выше, но это связано с обратной совместимостью со старыми версиями Python.

Итак, если вы напечатаете:

print type(type)
Code language: PHP (php)

Вы получите:

< type 'type' >
Code language: HTML, XML (xml)

Подтверждение того, что тип это и есть type.

Термин метакласс просто означает что-то вроде того, что было создано для создания других классов. Другими словами, это класс класса. Это означает, что экземпляр класса в данном случае является классом. Type считается метаклассом, поскольку экземпляр типа является классом.

Например, когда мы выше писали:

class_object = myClass()

В результате просто создается объект/экземпляр класса myClass. Другими словами, мы используем класс для создания объекта.

Точно так же, когда мы пишем:

class myClass(object): pass

Мы использовали метакласс для создания класса myClass (который считается типом). Так же, как объект является экземпляром класса, класс является экземпляром метакласса.

Использование метаклассов для создания класса

В этом разделе мы рассмотрим, как можно использовать метакласс для создания класса, вместо того чтобы использовать объявление класса. Как мы видели ранее, метакласс по умолчанию имеет тип type. Поэтому мы можем использовать следующий оператор для создания нового класса:

new_class = type('myClass',(),{})
Code language: JavaScript (javascript)

Если вы хотите упростить, вы можете присвоить имя переменной myClass имени того же класса.

Мы использовали словарь {} для определения атрибутов класса. Таким образом, у вас будет следующая форма декларации:

myClass = type('myClass',(),{'a':True})
Code language: PHP (php)

Аналогично:

class myClass(object): a = True

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *