Статья, в которой рассказывается, что такое метакласс Python

Python
Статья, в которой рассказывается, что такое метакласс Python

Дядя Черепаха изобрел Python, а затем интегрировал в язык множество концепций, таких как итераторы, декораторы, функции, генераторы, классы, объекты, сопрограммы и многое другое.

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

Моя задача сегодня состоит в том, чтобы полностью понять, что такое метакласс. Не забудьте поставить мне лайк и поделиться им с большим количеством людей, когда вы его поймете.

Чтобы понять метаклассы, начнем с объектов.

Объект

Все в Python является объектом.Вы, должно быть, слышали это предложение (вы слышали его сейчас), число является объектом, строка является объектом, список является объектом, а словарь является объектом, например:

>>> i = 10
>>> s = "abc"
>>> nums = [1,2,3]
>>> dicts = {"name":"zhang"}

Правая сторона знака равенства — это объект, а левая сторона — это имя, данное этим объектам.Любой объект имеет три основных свойства: идентификатор, значение и тип.

логотип

Идентификатор совпадает с идентификатором удостоверения личности человека.Каждый объект имеет уникальный идентификатор, который не изменится в течение всего жизненного цикла.Можно считать, что идентификатор - это адрес объекта в памяти компьютера. по функцииid()Вы можете просмотреть идентификатор объекта.

>>> id(i)
40592592
>>> id(s)
44980584

стоимость объекта

Вторым атрибутом объекта является значение, и значение хорошо понятно.Например, значение i равно 10, значение s равно abc, а значение nums равно 1,2,3.

Типы

Еще одним важным атрибутом объектов является тип.Любой объект имеет свой тип.Объект строится из своего типаНапример, тип i выше имеет тип int, а этот объект создан из int. Тип s — это строковый тип, тип nums — это тип списка, а тип dicts — это тип словаря, и все они построены из соответствующих типов.

пройти черезtype()Вы можете просмотреть тип объекта.

>>> type(i)
<class 'int'>
>>> type(s)
<class 'str'>
>>> type(nums)
<class 'list'>
>>> type(dicts)
<class 'dict'>

Тип объекта также совпадает с идентификатором и не изменится после его определения.

Классы и (экземпляры) объекты

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

>>> class Person:
		# 这里的 self 指某个实例对象自己
...     def __init__(self, name):
			# name 是实例的属性
...         self.name = name
		# live 是类的属性
		live = True

Человек здесь — это пользовательский класс, класс — это абстрактный шаблон, он не относится ни к Чжан Саню, ни к Ли Си, теперь мы можем создать (создать экземпляр) конкретный, реальный, названный, вызвав этот класс.объектout, этот объект называется экземпляром объекта.

>>> p1 = Person("zhangsan")
>>> p1.name
'zhangsan'
>>>
>>> p2 = Person("lisi")
>>> p2.name
'lisi'

Здесь p1 и p2 — экземпляры (экземпляры) объектов. Типы этих двух объектов относятся к классу Person. Отношения между классом и (экземпляром) объекта аналогичны отношениям между формой транспортного средства и построенным реальным автомобилем. Такой же.

>>> p1
<__main__.Person object at 0x0195AA30>
>>> type(p1)
<class '__main__.Person'> # 这里的__main__是模块名称

Классы — это объекты (также известные как объекты классов)

Мы только что сказали, что все является объектом, экземпляр (реальная машина) — это объект, а класс (форма) — это, конечно, объект, потому что это тоже реальная вещь,

Когда интерпретатор Python выполняет ключевое словоclassПри выполнении этой инструкции внутри будет создан класс с именем «Человек».Этот класс также является объектом, который мы называем объектом класса (обратите внимание на разницу между объектами-экземплярами), который также имеет идентификатор, тип и стоимость. Например:

>>> id(Person)
26564024
>>> type(Person)
<class 'type'>
>>> Person
<class '__main__.Person'>

Мы заметили, что тип этого объекта класса  Person  называется «тип», что означает, что класс Person создается по типу.Теперь вы должны помнить, что p1 и p2 являются объектами экземпляра, а Person является объектом класса. Кроме того, что, черт возьми, это тип?

Давайте посмотрим, тип экземпляра объекта p1 — это объект класса Person, а тип Person — тип

>>> nums = [1,2,3]
>>> type(nums)
<class 'list'>
>>> type(list)
<class 'type'>

Тип nums — список, тип списка — тоже тип, тип словарного класса (dict) — тоже тип, тип всех классов — тип, то есть все классы создаются по типу. Этот тип является метаклассом. Дао производит один, один производит два, а три производят все вещи. Метакласс является создателем в Python. (Метакласс сам по себе является объектом)

Теперь мы все знаем, что классы (объекты) можно использовать с помощьюclassСоздание ключевого слова, мы также знаем, что тип класса (объекта) является типом, поскольку мы знаем, что его тип является типом, он определенно может быть создан по типу (метаклассу).

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

Как упоминалось ранее,typeОдна функция — проверка типа объекта, на самом деле у него есть еще одна функция — динамическое создание класса (объекта) как метакласса.

>>> Person = type("Person", (), {"live":True})
>>> Person
<class '__main__.Person'>

Person — это класс, который эквивалентен:

>>> class Person:
...     live = True
...
>>> Person
<class '__main__.Person'>

метаклассtypeСинтаксис создания класса:

type(类名,基类元组(可以为空), 属性字典)

Итак, в чем польза метаклассов? Нам действительно нужны метаклассы? Пожалуйста, обратите внимание на следующее объяснение (оставьте вам больше времени на переваривание, O(∩_∩)O)

Блог:foofish.net
Публичный номер: Zen of Python

Python之禅