Python:如何判断属性MRO
Python: How to determine attribute MRO
我们可以通过访问对象的 __mro__
属性轻松确定对象的 mro。
在我的例子中,我有一个非常复杂的层次结构,我试图理清这个层次结构以避免我们正在经历的当前 mro 地狱。
我有一个很长的 mro 链,就像这样:
(<class 'CompanyUserViewSet'>, <class 'CompanyGenericViewSet'>,
<class 'CompanyDispatchMixin'>, <class 'CompanyCorsLiteMixin'>,
<class 'CorsLiteMixin'>, <class 'ErrorHandlingMixin'>, ..., <type 'object'>)
为了问题的缘故,这被缩短了,但在这种情况下,它总结为 19
classes.
我目前有一个问题:我需要知道这些 classes python 中的哪一个正在解析 as_view
方法。
我知道我可以按顺序检查这些,但我看不出我做错了什么,因为被调用的 as_view
不是正确的。
对该方法的调用非常简单,我们有一个 CompanyUserViewSet
Rest Framework 正在使用它来为路由器构建 url:
view = viewset.as_view(mapping, **route.initkwargs)
给定对象及其属性(或方法)之一,我如何确定 class 正在 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)
我们可以通过访问对象的 __mro__
属性轻松确定对象的 mro。
在我的例子中,我有一个非常复杂的层次结构,我试图理清这个层次结构以避免我们正在经历的当前 mro 地狱。
我有一个很长的 mro 链,就像这样:
(<class 'CompanyUserViewSet'>, <class 'CompanyGenericViewSet'>,
<class 'CompanyDispatchMixin'>, <class 'CompanyCorsLiteMixin'>,
<class 'CorsLiteMixin'>, <class 'ErrorHandlingMixin'>, ..., <type 'object'>)
为了问题的缘故,这被缩短了,但在这种情况下,它总结为 19
classes.
我目前有一个问题:我需要知道这些 classes python 中的哪一个正在解析 as_view
方法。
我知道我可以按顺序检查这些,但我看不出我做错了什么,因为被调用的 as_view
不是正确的。
对该方法的调用非常简单,我们有一个 CompanyUserViewSet
Rest Framework 正在使用它来为路由器构建 url:
view = viewset.as_view(mapping, **route.initkwargs)
给定对象及其属性(或方法)之一,我如何确定 class 正在 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)