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)