Чтобы понять, почему вы получаете результат, который вы получили, вы должны понять, что такое метакласс. И чтобы понять это, вы должны понимать, как создаются классы в Python.
Когда вы пишете оператор class
, интерпретатор открывает новое пространство имен, выполняет код в операторе и просматривает состояние пространства имен после выполнения этого кода. Затем он обрабатывает важные детали (локальные переменные, имя класса, ...) и передает их встроенному классу type
. Поэтому экземпляры type
- это то, что мы обычно называем классами, поэтому type
- это «метакласс».
Когда вы переопределяете метакласс, вы говорите Python не использовать type
для создания нового класса. Вместо этого он передаст те же вещи пользовательскому классу. Это позволяет вам переопределить значения по умолчанию в type
.
Таким образом, person.Person
был создан путем передачи некоторых аргументов вашему метаклассу. В частности, это экземпляр этого класса, поэтому его __class__
является метаклассом!