Python:如何确定属性MRO



通过访问对象的__mro__属性,可以很容易地确定对象的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框架正在使用它来构建路由器的url:

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

我如何确定,给定一个对象和它的一个属性(或方法)从什么类是python解析它?

要获取方法定义的位置,请使用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)

相关内容

  • 没有找到相关文章

最新更新