1

__mro__我们可以通过访问其属性轻松确定对象的 mro 。

就我而言,我有一个非常复杂的层次结构,我试图解开它以避免我们正在经历的当前 mro 地狱。

我有一个很长的 mro 链,像这样:

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

为了这个问题,这被缩短了,但在这种情况下,它总结为19类。

我目前有一个问题:我需要知道 python 正在从这些类中的哪个类中解析该as_view方法。

我知道我可以按顺序检查这些,但我看不出我做错了什么,因为as_view被调用的不是正确的。

对该方法的调用非常简单,我们有一个CompanyUserViewSetRest Framework 用于构建路由器的 url:

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

给定一个对象及其属性(或方法)之一,我如何从 python 解析的类中确定它?

4

1 回答 1

2

要获取定义方法的位置,请使用method.__func__.__qualname__. 这需要 Python >= 3.3。在较旧的 python 中,您可以使用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)
于 2015-10-15T17:16:26.497 回答