如何检查绑定方法是否与未绑定方法相同

时间:2016-12-15 10:35:29

标签: python class

我想检查(在我的测试中)对象的方法与给定类的方法相同。

class Cls:
    def foo(self):
        pass

obj = Cls()
assert obj.foo == Cls.foo  # assert will fail

如果绑定方法与未绑定方法相同('绑定'除外),可以使用哪个操作代替obj.foo == Cls.foo生成True

3 个答案:

答案 0 :(得分:4)

在Python 3中:

>>> class Cls:
...     def foo(self):
...         pass
... 
>>> obj = Cls()
>>> obj.foo
<bound method Cls.foo of <__main__.Cls object at 0x101d8f588>>
>>> dir(obj.foo)
['__call__', '__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__func__', '__ge__', '__get__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__self__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']
>>> obj.foo.__func__
<function Cls.foo at 0x101d92400>
>>> obj.foo.__func__ is Cls.foo
True

查看对象的dir()是一种探索和查找可能有用的属性的简单方法。

答案 1 :(得分:4)

在Python 2.7.x上:

>>> Cls.foo.__func__ is obj.foo.__func__
True

答案 2 :(得分:2)

bruno desthuilliers's solution for Python 2.7Alex Hall's solution for Python 3合并到适用于两个版本的版本:

class Cls:
    def foo(self):
        pass

obj = Cls()
assert getattr(Cls.foo, '__func__', Cls.foo) is obj.foo.__func__