Метаклассы в Python

В этом руководстве мы обсудим, что такое метаклассы в объектно-ориентированном контексте в Python.

Метаклассы в Python

Проще говоря, метакласс определяет поведение класса. Обычный класс определяет, как ведет себя объект или экземпляр класса.

В Python метаклассы заранее созданы и неявны; это означает, что метакласс создается в фоновом режиме при создании класса.

базовый класс object в Python

В Python каждый создаваемый класс неявно наследует object базового класса. Внутри класса object есть встроенные частные методы, такие как __init__ и __new__. Прежде чем класс даже начнет создавать свои собственные поля, функции и атрибуты, он наследует все атрибуты, которые есть в классе object.

Создадим, например, новый класс ChildObject. Внутри этого класса находится объявление одного атрибута и одной функции.

class ChildObject:
    num = 1
    
    def printStatement():
        print("This is a child object.")

Чтобы убедиться, что класс ChildObject наследует все атрибуты и функции, входящие в класс object, используйте функцию dir(), которая возвращает список всех функций и атрибутов, определенных в указанном объекте.

print(dir(ChildObject))

Выход:

['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'num', 'printStatement']

Обратите внимание, что перед атрибутом num и функцией printStatement есть довольно много частных атрибутов и функций, которые явно не определены в ChildObject; это означает, что они либо неявно определены внутри класса, либо наследуются от класса object.

Проверим атрибуты и функции класса object с помощью той же функции dir():

print(dir(object))

Выход:

['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']

метакласс type в Python

Теперь, когда мы рассмотрели класс object, давайте обсудим собственно метакласс в Python, type. Опять же, метакласс - это класс, который создает и определяет поведение другого класса.

Две функции могут предоставлять метакласс данного класса: type() и __class__. Обе эти функции выводят класс переданного аргумента.

Например, давайте использовать функции type() и __class__ для данного класса ChildObject из приведенных выше примеров.

class ChildObject:
    num = 1
    
    def printStatement():
        print("This is a child object.")
        
print(type(ChildObject))
print(ChildObject.__class__)

Выход:

<class 'type'>
<class 'type'>

Обе функции выводят <class 'type'>. Это сигнализирует о том, что класс ChildObject имеет type тип. type - это метакласс класса ChildObject и любого другого класса в этом отношении.

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

Сопутствующая статья - Python Class

  • Статические переменные класса в Python
  • Статический метод Python
  • Частные методы в Python