Python: как определить атрибут MRO

Мы можем легко определить mro объекта, получив доступ к его __mro__ приписывать.

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

У меня очень длинная цепочка, как эта:

(<class 'CompanyUserViewSet'>, <class 'CompanyGenericViewSet'>, 
 <class 'CompanyDispatchMixin'>, <class 'CompanyCorsLiteMixin'>, 
 <class 'CorsLiteMixin'>, <class 'ErrorHandlingMixin'>, ..., <type 'object'>)

Это сокращено ради вопроса, но в этом случае оно суммирует до 19 классы.

В настоящее время у меня есть проблема: мне нужно знать, из какого из этих классов Python разрешает as_view метод.

Я знаю, что могу проверить это по порядку, но я не вижу, что я делаю неправильно, так как as_view это вызвано не правильно.

Вызов метода довольно прост, у нас есть CompanyUserViewSet этот Rest Framework использует для создания URL для маршрутизатора:

view = viewset.as_view(mapping, **route.initkwargs)

Как я могу определить, учитывая объект и один из его атрибутов (или методов) из какого класса Python разрешает его?

1 ответ

Решение

Чтобы получить, где метод определен, используйте, method.__func__.__qualname__, Это требует Python >= 3.3. В старых питонах вы можете использовать пакет qualname.

Смотрите пример ниже:

class A:
  def f1():
    return 'f1A'
  def f2():
    return 'f2A'

class B(A):
  def f2():
    return 'f2B'

a = A()
b = B()
print(a.f1.__func__.__qualname__)
print(a.f2.__func__.__qualname__)
print(b.f1.__func__.__qualname__)
print(b.f2.__func__.__qualname__)

который производит вывод:

A.f1
A.f2
A.f1
B.f2

Если вы используете пакет qualname:

import qualname
print qualname.qualname(a.f1)
print qualname.qualname(a.f2)
print qualname.qualname(b.f1)
print qualname.qualname(b.f2)
Другие вопросы по тегам