考虑一个Python 3程序,其中绑定方法以某种方式传递。如何将方法与在类定义中定义它们的原始函数进行比较?或者以OOP术语表示:如何检查绑定方法是否是函数的实例。
让我们举一些REPL-ing:
>>> class C(object):
... def m(self):
... print("Calling m")
...
>>> o = C()
>>> print(o.m)
<bound method C.m of <__main__.C object at 0xb6f56d6c>>
>>> print(C.m)
<function C.m at 0xb6f4c6a4>
>>> if o.m == C.m:
... print("Equality")
...
>>> if isinstance(o.m, C.m):
... print("Relation")
...
Traceback ...
我想要达到的目的是能够以某种方式检查o.m是否与C.m相关。
当然,我们当然可以采用C.m和o.m的字符串表示,正则表达式删除了读取C.m的部分,最终结果是o.m与C.m相关。但必须有更好的方法来处理这个问题。
答案 0 :(得分:3)
要查看两个方法是否具有相同的基础函数对象,请使用__func__
属性:
>>> C.m == o.m.__func__
True
在Python 2中,它是im_func
属性。
此属性在documentation。
中说明答案 1 :(得分:0)
事实证明,每个方法都有一个__func__
字段,用于保存原始函数。换句话说,比较可以写成:
if o.m.__func__ == C.m:
print("Equality")