将函数与python 3中的绑定方法进行比较

时间:2016-05-02 10:25:33

标签: python-3.x

考虑一个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相关。但必须有更好的方法来处理这个问题。

2 个答案:

答案 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")