Самоанализ Python: где живет метод mro ()? - PullRequest
0 голосов
/ 15 октября 2019

Я пытаюсь получить базовое понимание интроспекции Python, и при этом я нашел в этом отношении полезный mro() упомянутый метод здесь .

Когда я (как самоанализ)упражнение) пытался использовать указанный метод и встроенную функцию dir(), пытаясь выяснить, где может жить mro(), однако мне это не удалось. Почему?

Вот мой подход:

  • метод mro(), очевидно, доступен без импорта (в отличие от inspect.getmro(), который является частью модуля inspectнапример, str.mro() возвращает [<class 'str'>, <class 'object'>]

  • Поскольку str.mro() возвращает [<class 'str'>, <class 'object'>], метод mro() должен находиться где-то в str и / или object.

  • Тем не менее, ни dir(str), ни dir(object), по-видимому, не содержат метод mro (). Также help () и help (str.mro) не просветляют озадаченного ученика в самоанализе.

1 Ответ

1 голос
/ 15 октября 2019

Если вы посмотрите на dir(type), вы найдете магический метод атрибут __mro__. Цитируется здесь :

class. __ mro __

Этот атрибут является кортежем классов, которые учитываются при поиске базовых классов во времяразрешение метода.

class. mro ()

Этот метод может быть переопределен метаклассом для настройки порядка разрешения метода для его экземпляров. Он вызывается при создании экземпляра класса, и его результат сохраняется в mro

Посмотрите на этот ответ , чтобы узнать больше о type, который является обычным метаклассомиспользуется в Python. Отсюда:

type - это обычный метакласс в Python. type сам по себе класс, и это его собственный тип. Вы не сможете воссоздать что-то вроде type исключительно в Python, но Python немного обманывает. Чтобы создать свой собственный метакласс в Python, вы действительно хотите создать подкласс type.

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