2012-01-12 14 views
2
class Test: 
     def func(): 
      print('func') 
test1 = Test() 
test2 = Test() 

test1.func() #TypeError: fun1() takes no arguments (1 given) 
test2.newfunc = Test.func 
test2.newfunc()#It goes well 

# update part 
def foo(self): 
    pass 
Test.foo = foo 
test1.foo # it is bound method 
test2.foo = foo 
test2.foo # it is function 
# end 

2つの方法に違いはありますか?おかげさまで python関数

重要なのは、取得がインスタンスではなくクラスで行われることです。

+0

このクラスのものがどのように動作するのか把握していないように見えます。あなたがしていることは意味をなさない。あなたがそれを把握していなければ、Pythonのマニュアルとチュートリアルは良いものです。 –

+0

これは面白いことです...なぜ 'test2.newfunc()'が動作するのかわかりません。 – DonCallisto

+0

@Romanの答えは完全に正しいです。 test2.newfunc = Test.Funcを実行すると、オブジェクト定義がバイパスされ、関数定義に直接入ります。したがって、パラメータは指定されません。今それは明確です – DonCallisto

答えて

2

調査のビットを:したがって、彼らは通常、self引数で宣言されている

>>> test1.func 
<bound method Test.func of <__main__.Test instance at 0x800f211b8>> 
>>> Test.func 
<unbound method Test.func> 

次に、ユーザ定義のバインド方法(私たちの場合はtest1.func)が呼び出され、この呼び出しは、実際にありますTest.func(test1)として実行されます - クラスのインスタンスは常に最初の引数として渡されます。

Python Data modelでこのトピックの詳細をご覧ください。上記


編集

出力は、Python 2.6からです。 Test.funcは単純な関数なので、何の「魔法」はしばらく追加されません、

>>> test1.func 
<bound method Test.func of <__main__.Test object at 0xb747624c>> 
>>> Test.func 
<function func at 0xb74719ec> 

ご覧のとおり:あなたのためのTest.func()作品以来、私はあなたがこの場合はPython 3を使用している出力は、次のことになると仮定しますそれを呼び出す。

+0

はい。しかし、私はまだtest2.newfunc()が呼び出されたとき、なぜtest2が引数として渡されたのか理解できません。ありがとう。 – dragonfly

+0

@dragonfly編集を参照してください。 –

+0

ご協力ありがとうございます。私はそれを得たと思う。 – dragonfly

6

クラスのインスタンスで呼び出されるクラスのメソッドは、インスタンス参照が引数として自動的に渡されます。

class Test: 
     def func(self): 
      print('func') 

test1 = Test() 
test1.func() # self = test1 
+0

ありがとうございます。私は英語がうまくない。私はあなたが何を意味するか知っていると思う。 test1.func()が呼び出されると、インスタンス参照test1が渡されます。ただし、test2.newfunc()が呼び出されたときに、インスタンス参照test2が渡されないのはなぜですか。 func()が呼び出される同じメソッドを知っています。 – dragonfly