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



考虑以下情况:

>>> "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__可能没有未绑定到任何对象的基本符号 - 在这种情况下,除了保留特殊名称列表之外,检测它的最佳方法是什么(如何权威地构建这样的列表?

不适用于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

这甚至应该适用于 bltns:

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

对于层次结构:

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

最新更新