如何通过方法包装器获取绑定到对象的基础函数的ID?

时间:2019-07-11 12:50:32

标签: python python-3.x

请考虑以下情况:

>>> "a".capitalize.__call__
<method-wrapper '__call__' of builtin_function_or_method object at 0x1022e70d8>
>>> "a".capitalize.__call__.__call__
<method-wrapper '__call__' of method-wrapper object at 0x1022e2b70>
>>> id("a".capitalize.__call__)
4331547448
>>> id("a".capitalize.__call__.__call__)
4331547504
>>> id("a".capitalize.__call__) == id("a".capitalize.__call__.__call__)
False

在两种情况下如何在运行时确定__call__引用相同的基本符号?

编辑: 首先可能期望__call__存在这样的东西是不合理的,因为__call__可能没有不与任何对象绑定的基本符号-在这种情况下,最好的方法是除了保留特殊名称列表以外,还可以检测其他内容(如何建立权威列表?)?

1 个答案:

答案 0 :(得分:1)

由于builtin_function_or_method没有__func__,因此不适用于__func__

如果您只使用课程,则可以比较>>> class Foo: ... def bar(self): ... pass ... >>> >>> a = Foo() >>> b = Foo() >>> a.bar.__func__ <function Foo.bar at 0x7f6f103e5ae8> >>> a.bar.__func__ is b.bar.__func__ True

type(a).bar is type(a).bar

但是我想最好以另一种方式来做:与其尝试从实例中获取功能,不如先获取类型:

>>> type("").capitalize is type("a").capitalize
True

哪一个甚至对bltns也适用:

>>> class A:
...     def foo(self):...
... 
>>> class B(A):...
... 
>>> a = A()
>>> b = B()
>>> type(a).foo is type(b).foo
True

对于层次结构:

{{1}}