2012-02-06 8 views
2

私は解決できない面白い状況に遭遇しました。 def a(self, x, y):のように1つのクラス内に関数 の定義があり、a(par1, par2)のように他の場所から呼び出されています。しかし、の代わりにpar1が置換され、xの代わりにpar2yが未初期化のままになります。しかし、そうであってはならないでしょう:xyの代わりにpar1par2を置き、Pythonにはselfがあるはずです。これはPython 2.7で正しく動作しますが、この面白いことは3.2で発生します。メソッドaには修飾子がありませんが、呼び出すメソッドには@classmethod修飾子があります。それはちょっと変だけど、おそらく@classmethodは3番目のバージョンで変更されています。誰が何が起こっているのか、どのように物事が正しく機能するかを知っているなら、教えてください。Pythonはパラメータの1つを自己に置き換えます

ありがとうございました!あなたの説明から

+1

.a(par1、par2) 'のように' a'を呼びますか? – ajwood

+3

コードの外観の完全な例を表示できますか? – SingleNegationElimination

+8

動作の完全で実行可能な例を提供できますか? – Kevin

答えて

0

私はこのようなコードを推測している:これはそうのようなクラッシュ2.7では

class Test(object): 

    def a(self, par1, par2='empty'): 
     print(self, par1, par2) 

    @classmethod 
    def b(cls, fjord): 
     print(fjord) 
     cls.a('par1', 'par2') 

test = Test() 
test.a('this', 'that') 
test.b('cold') 

を:

(<__main__.Test object at 0x00B4A710>, 'this', 'that') 

cold 

Traceback (most recent call last): 
    File "test.py", line 11, in <module> 
    test.b('cold') 
    File "test.py", line 7, in b 
    cls.a('par1', 'par2') 
TypeError: unbound method a() must be called with Test instance as first argument 
      (got str instance instead) 

3.2で、それはうまく動作しますが - 未結合の方法がないので、それらが単に機能しているだけです。

selfがインスタンスでない理由は、クラスメソッドから呼び出されているからです。クラスメソッドはselfを取得できないため、それを渡すことはできません。

+0

これは私が考え始めたものですが、コードは2.7で動作しますが、3.2では失敗するという主張です。 –

+0

おそらく、それは失敗していますが、TypeErrorが他の場所にキャッチされています –

関連する問題