Метакласс метакласса? - PullRequest
1 голос
/ 11 июня 2019

На экзамене по теории ООП мне был задан вопрос «Что такое метакласс? Что такое метакласс метакласса?».Я легко ответил на первый, но понятия не имею о втором.Есть ли что-то вроде «метаклассов метаклассов» в каком-либо языке программирования или даже теоретически?Я пытался реализовать что-то подобное в Python 3, но, кажется, это слишком сложно для меня (у меня был простой курс Python только на 1 семестр).

1 Ответ

1 голос
/ 11 июня 2019

Да.

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

Таким образом, в языке ООП, где «классы» являются объектами первого класса, то есть они сами являются объектами, и все правила, которые применяются к другим объектам, применяются также и к классам - они просто оказываются «шаблоном» для других типов объектов сами эти классы являются экземплярами «чего-то». Это что-то «метакласс» - это просто слово для обозначения «класса класса».

И бывает, что этот "метакласс", класс класса, является объектом также, как и другие классы. И как таковой, он также является экземпляром класса - этот класс метакласса можно назвать «метаметаклассом».

Теперь приведем его к конкретному примеру в Python - по умолчанию метакласс для классов в Python - type. То есть type - это класс, экземпляры которого являются классами.

В языке есть оригинальные механизмы, которые в некоторых случаях делают практичным наследовать класс от type, а затем работать с пользовательскими метаклассами. Итак, что же это за класс type? Это будет "метаметакласс" для большинства (или всех) классов в Python.

И, как говорится, класс «тип» сам по себе «тип». да - это циклическая ссылка, без которой объектная иерархия языка не может быть загружена. Я не знаю, делают ли это другие языки, но в Python это совершенно очевидно:

>>> class A:
...    pass
... 
>>> type(A)
<class 'type'>
>>> type(type(A))
<class 'type'>
>>> type(type(A)) is type(A)
True

Теперь, помимо такой работы в качестве концепции, он на самом деле может быть использован как метаметакласс, и есть механизмы языка, которые можно настроить, унаследовав type для этой цели. (Обычно он наследуется для настройки в качестве «обычного» метакласса).

По стечению обстоятельств у меня был случай использования "метаметакласса", проиллюстрированный на этой самой неделе, в вопросе здесь - путем настройки метода type __call__ в Python вместо __new__ или __init__, и используя этот пользовательский класс в качестве «метакласса для метакласса», можно фактически управлять тем, как эти методы вызываются, и параметрами, передаваемыми им методами, при создании обычного класса.

...