Рубрики
Без рубрики

Python Metaclasses.

Резюме: Метаклассы – это класс класса. Другими словами, класс является экземпляром метакласса. MetAclass может быть создан с использованием двух методов: (1) класс типа, который является встроенным метаклассом в Python. (2) Создание пользовательских метакласс с использованием ключевого слова Metaclass. Проблема: что такое метаклассы и почему мы их используем в … Python Metaclasses Подробнее »

Автор оригинала: Shubham Sayon.

Резюме: Метаклассы – это класс класса Отказ Другими словами, Класс является экземпляром метакласса Отказ Метакласс может быть создан с использованием двух методов: (1) Тип Класс, который является встроенным метаклассом в Python. (2) Создание Пользовательские метакласс используя Метакласс ключевое слово.

Проблема: Что такое метаклассы и почему мы используем их в Python?

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

Пожалуйста, проведитесь правом, чтобы пройти концепции в нашей почте Instagram:

Честно говоря, Metaclasses – это продвинутая концепция в Python и может быть довольно сложной, чтобы понять. Однако в этой статье я постараюсь проще для вас.

Что такое метакласс?

Термин Мета означает то, что является самоссылками. Вы, вероятно, слышали бы о метаданных, что означает данные о данных. (Пожалуйста, не волнуйтесь, если у вас нет!). Следовательно, Meta-X обычно означает X о X. Я надеюсь, что вы получите точку зрения. Это, наконец, приносит нам вопрос: что такое «метакласс»?

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

Инстанции: классы:: Классы: экземпляры

Реальный мир пример для вас, который должен самостоятельно пояснить:

Прежде чем мы продолжаем дальше с нашей дискуссией, вот правило в Python, который я хочу напомнить вам:

Все в Python – это объект.

Тип метакласс

Чтобы получить концепцию метаклассов, крайне важно понимать использование Тип в питоне.

Простые условия, Тип это метакласс, который производит другие классы.

Теперь есть 3 разных способа, в которые вы можете использовать Тип В Python:

  1. Тип можно использовать для поиска Тип Объект.
  2. Тип можно использовать для поиска Тип Класс.
  3. Тип можно использовать для Создать новые классы .

Теперь давайте погрузимся в каждый вариант использования Тип Метакласс с помощью примеров.

❖ Использование типа, чтобы найти тип объекта

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

Давайте посмотрим на следующую программу, которая возвращает тип строковой переменной и объектом класса. (Пожалуйста, следуйте за комментариями в коде, приведенном ниже, чтобы лучше понять концепцию.)

#creating a class
class Finxter(object):
  pass

#instatiating the class with an object
obj = Finxter()
# finding the type of the object
print(type(obj)) 

# creating a string variable
name = 'Harry'
# finding the type of the variable name
print(type(name))

Выход :

❖ Использование типа, чтобы найти тип класса

Снова возвращаясь к нашему основным правилам большого пальца, где мы изучали, что все в Python – это класс. Это означает, что класс также является объектом в Python и должен иметь тип, как любой другой объект. Давайте узнаем, каков тип класса в Python в следующей программе:

#creating a class
class Finxter(object):
  pass

#instatiating the class with an object
obj = Finxter()
# finding the type of class Finxter
print(type(Finxter)) 
# finding type of class string 
print(type(str))

Выход:


Вышеуказанный вывод четко демонстрирует, что Тип Метакласс всех классов в Python.

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

print(type(type))

Выход:

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

Когда Тип Класс называется только с 1 аргументом, он возвращает тип объекта, но когда вызывается с использованием 3 параметра это создает класс.

Следующие аргументы, приведенные ниже, передаются на Тип класс:

  1. Имя класса.
  2. Кортеж, содержащий базовые классы, унаследованные классом.
  3. Словарь классов, который служит локальным пространством имен и содержит методы классов и переменных.

★ синтаксис для создания класса, используя Тип Класс был дан ниже:

Пример 1: Простой пример, который не имеет унаследованного класса и спирального словаря класса.

Finxter = type('Finxter', (), {})
obj = Finxter()
print(obj)

Выход:

<__main__.Finxter object at 0x7f8cf58025e0>

Пример 2: Теперь давайте посмотрим на программу, которая имеет имя класса, базовый класс и атрибут в словаре.

def coffee(self): 
	print("Factory Class - Coffee Class Method!") 

# base class 
class machine: 
	def vendingMachine(self): 
		print("Base Class - Machine Class Method!") 

# creating factory class 
factory = type('factory', (machine, ), dict(greet="Welcome Finxter!", foo=coffee)) 
# Creating instance of factory class 
obj = factory() 
# calling inherited method 
obj.vendingMachine() 
# calling factory class method 
obj.foo()
# printing variable 
print(obj.greet) 

Выход:

Base Class - Machine Class Method!
Factory Class - Coffee Class Method!
Welcome Finxter!

Пример 3: Сложный пример, который имеет внешнюю функцию, которая присваивается атрибуту словаря пространства имен с использованием имени функции.

# Defining external function
def foo(object):
  print("value = ",object.val)

# Creating class using type with attributes val and code that access the external function 
Finxter = type('Finxter', (), {'val':'PYTHON','code':foo})

# Using Object of Finxter class to access the attributes
obj = Finxter()
print(obj.val)
obj.code()

Выход:

PYTHON
value =  PYTHON

Теперь давайте посмотрим на упрощенную версию создания вышеуказанного Finxter класс без использования Тип () функция.

def foo(object):
  print("value = ",object.val)
 
class Finxter:
   val = "PYTHON"
   code = foo

obj = Finxter()
print(obj.val)
obj.code()

Тип Это метакласс данных по умолчанию, однако он содержит специальные методы/«Magic Methods», которые могут быть использованы создавать пользовательские метаклассы. Эти методы:

  • __новый__()
  • __в этом__()
  • __подготовить__()
  • __вызов__()

Создание пользовательского метакласса

Что происходит, когда мы создаем класс, как тот, который приведен ниже?

class Finxter:
  pass

obj = Finxter()

Как только объект для класса Finxter создан __call __ () Метод типа типа Metaclass (который происходит, чтобы быть родительским классом Finxter ) вызывается. __call __ () Метод тогда вызывает __new __ () и __init __ () методы. Поскольку эти методы не определены в классе Finxter Эти методы автоматически унаследованы. Однако мы можем переопределить эти методы в пользовательском метаклассе, тем самым предоставляя индивидуальное поведение при создании класса Finxter Отказ

Пример: Рассмотрим, что у нас есть структура тестирования, и мы хотим отслеживать заказ, в котором определены классы. Мы можем сделать это, используя метакласс. Давайте посмотрим, как это можно сделать в следующем коде:

class MyMeta(type):

    counter = 0

    def __init__(cls, name, bases, d):
        type.__init__(cls, name, bases, d)
        cls._order = MyMeta.counter
        MyMeta.counter += 1
        print(cls._order," ",name)

class MyClass(metaclass=MyMeta):    
    pass

class MyClass_A(MyClass):
    pass

class MyClass_B(MyClass):    
    pass
    
class MyClass_C(MyClass):
    pass

Выход:

0   MyClass
1   MyClass_A
2   MyClass_B
3   MyClass_C

Весь подкласс MyClass Получает атрибут класса _Order который записывает порядок, в котором были определены классы.

Должны ли мы использовать MetClasses?

Простой ответ на это, если проблема может быть решена в более простой методе, то вы не должны использовать метаклассы, поскольку они довольно сложны и трудно понять. Большинство изменений классов можно сделать с использованием других методов, таких как использование классовых декоративов. Основным использованием корпуса метакласс создает API для E.G. Django Orm.

Python Guru Tim Peters (автор дзен Питона) сказал,

«Метаклассы более глубокие магии, что 99% пользователей никогда не беспокоится об этом. Если вам интересно, нужны ли вам, вы не (люди, которые на самом деле нуждаются в том, чтобы они знали с уверенностью, что они нуждаются в них и не нуждаются в объяснении, почему) ».

Давайте посмотрим на следующую программу, которая дополнительно оправдывает, почему мы должны избегать использования метаклассов, если не обязательно необходимо. Мы будем использовать тот же сценарий, что и в предыдущем случае при создании пользовательского метакласса. Однако вместо использования Metaclass мы будем использовать декораторы, которые проще, чем пользовательское создание метакласс. Давайте посмотрим.

counter = 0

def decorator(cls):
  class Main(cls):
    global counter
    cls._order = counter
    print(cls._order," ",cls.__name__)
    counter += 1
  return Main

@decorator
class MyClass():    
    pass

@decorator
class MyClass_A(MyClass):
    pass

@decorator
class MyClass_B(MyClass):    
    pass

@decorator    
class MyClass_C(MyClass):
    pass

Выход:

0   MyClass
1   MyClass_A
2   MyClass_B
3   MyClass_C

Если вы хотите узнать больше о декораторах, пожалуйста, посмотрите на наш учебник в блоге здесь.

Заключение

Мы узнали следующее в этом руководстве:

  • Быстрый отвод объектно-ориентированных концепций в Python.
  • Что такое метакласс?
  • Тип метакласс.
    • Использование типа, чтобы найти тип объекта.
    • Использование типа, чтобы найти тип класса.
    • Использование типа для создания нового класса.
  • Создание пользовательского метакласса.
  • Почему мы должны избегать использования метаклассов?

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

Я профессиональный Python Blogger и Content Creator. Я опубликовал многочисленные статьи и создал курсы в течение определенного периода времени. В настоящее время я работаю полный рабочий день, и у меня есть опыт в областях, таких как Python, AWS, DevOps и Networking.

Вы можете связаться со мной @:

Оригинал: “https://blog.finxter.com/python-metaclasses/”