请考虑以下情况:
>>> "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__
可能没有不与任何对象绑定的基本符号-在这种情况下,最好的方法是除了保留特殊名称列表以外,还可以检测其他内容(如何建立权威列表?)?
答案 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}}