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

Python 如何检查绑定方法是否与未绑定方法相同,python,class,Python,Class,我想检查(在测试中)object的方法是否与给定类的方法相同 class Cls: def foo(self): pass obj = Cls() assert obj.foo == Cls.foo # assert will fail 如果绑定方法与unbound方法相同(除了“boundness”之外),那么可以使用哪个操作代替obj.foo==Cls.foo来生成True >>> class Cls: ... def foo(self

我想检查(在测试中)object的方法是否与给定类的方法相同

class Cls:
    def foo(self):
        pass

obj = Cls()
assert obj.foo == Cls.foo  # assert will fail
如果绑定方法与unbound方法相同(除了“boundness”之外),那么可以使用哪个操作代替
obj.foo==Cls.foo
来生成
True

>>> 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
>>类别Cls:
...     def foo(self):
...         通过
... 
>>>obj=Cls()
>>>obj.foo
>>>主任(对象府)
“UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU"新","新","减少","减少","减少","报告","自我","设置属性","大小","结构","子类"
>>>目标函数__
>>>对象foo.\uuu func\uuuu是Cls.foo
真的
查看对象的
dir()
是探索和查找潜在有用属性的简单方法。

在Python 2.7.x上:

>>> Cls.foo.__func__ is obj.foo.__func__
True
将和合并到一个对两个版本都有效的:

class Cls:
    def foo(self):
        pass

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

那么
id(Cls.foo)=id(obj.foo)#返回true
呢?虽然这是一个好问题(因为潜在的答案会教给我们关于语言的有价值的见解),但在测试中断言这一点通常可能是一个坏主意,并且表明您正在测试实现的内部,而不是其行为。(当然,这取决于具体的上下文。如果你正在测试你自己的ORM,它利用反射,这样的测试是有意义的。)这是我的应用程序中参数解析的测试(使用子parser),我想确保
args.command
是给定子parser的“the”命令(每个子parser是一个单独的类)。我的实际测试代码片段:
assert args.command.\uu func\uu==commands.TransferCommand.command.\uu func\uu
在Python2.7.x上不起作用-
Cls.foo
是未绑定的方法,而不是
Cls.\uu dict\uu[“foo”]
对象。