2016-12-15 7 views
3

オブジェクトのメソッドが指定されたクラスのメソッドと同じであることを(私のテストで)チェックしたいと思います。操作(「boundness」を除く)バインド方法は非結合と同じである場合Trueを生成する代わりobj.foo == Cls.fooを用いることができるバインドされたメソッドがバインドされていないメソッドと同じかどうかをチェックする方法

class Cls: 
    def foo(self): 
     pass 

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

? Pythonの3では

+1

'ID(Cls.foo)== ID(OBJ。 foo)#returns true '? –

+0

これは**良い質問です**(潜在的な回答は言語に関する貴重な洞察を教えてくれるでしょう)**あなたのテストでこれを主張することは、しばしば悪いアイデアとなります。その行動よりむしろ内在。 (具体的なコンテキストにもよりますが、反射を利用する独自のORMをテストしている場合は、このようなテストは意味をなさないことがあります) –

+0

これは私のアプリケーションで(サブパーザを使って)引数を解析するためのテストです'args.command'が与えられたサブパーザのための 'the'コマンドであることを確かめたい(それぞれのサブパーザは別々のクラスです)。実際のテストコードのスニペット: 'assert args.command .__ func__ == commands.TransferCommand.command .__ func__' –

答えて

4

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

>>> 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()てみるには、探求し、潜在的に有用な属性を探すための簡単な方法です。 Pythonの2.7.35で

+0

Python 2.7.xでは動作しません。' Cls.foo'はアンバインドされたメソッドであり、 'Cls。 __dict __ ["foo"] 'オブジェクトです。 –

関連する問題