2016-09-16 19 views
0

デコレータを使用してメソッドに属性を追加しようとしています。なぜこのエラーが出るのか分かりません:TypeError:bet()missing 1必要な位置引数: 'betsize'。pythonデコレータを使用してメソッドに属性を追加する

ファイルgame.py

class Game(object): 
    def __init__(self): 
     .. 

    @AddCalled 
    def bet(self, betsize): 
     print(betsize) 

ファイルaddcalled.py:

class AddCalled(object): 
    def __init__(self, f): 
     self.f = f 
     self.called = False 

    def __call__(self, *args, **kwargs): 
     self.f(*args, **kwargs) 
     self.called = True 

私はQtのシグナル(ボタンクリック)からbetsizeを取得します。ターゲットスロット機能はgame.pyから()を賭けている

Traceback (most recent call last): 
    File "/home/njl/projet/mainui.py", line 27, in bet 
    self.game.bet(self.ui.betLine.text()) 
    File "/home/njl/projet/addcalled.py", line 15, in __call__ 
    self.f(*args, **kwargs) 
TypeError: bet() missing 1 required positional argument: 'betsize' 

私はいくつかをいただければ幸い私はベットボタンをクリックしたときに、私はこのエラーを得た今

class MainWindow(QtGui.QMainWindow, Ui_MainWindow): 
    .. 

    self.connect(self.ui.btnBet, SIGNAL("clicked()"), self.bet) 

    def bet(self): 
     #assuming 'game' is an instance of Game() 
     self.game.bet(self.ui.betLine.text()) 

ファイルmainui.py助けて。 Litteralyはそこにこだわった。

+0

コードにエラーがあります: 'self.f'を使って関数を' __init__'に保存しますが、 'call'に' self.func'を使ってアクセスしようとします。 – BrenBarn

+1

なお、メソッドに属性を格納すると、メソッドがいずれかのインスタンスによって呼び出されたときに一度しか設定されません。 'Game'の与えられたインスタンスで' bet'が呼び出されたかどうかは分かりません。この問題は 'called'属性の使い方によって異なります。 – BrenBarn

+0

ああ申し訳ありませんが、実際に私のコードによく書かれています。私はちょうど@BrenBarnを編集しました – khanh

答えて

2

あなたのデコレータは、ラップされた機能に正しくselfを渡しません。

通常、selfは関数オブジェクトの記述子メカニズムによって追加され、selfが埋め込まれたメソッドオブジェクトに変換されますが、記述子プロトコルを実装していないAddDecoratorオブジェクトでメソッドを置き換えましたそのため、あなたのAddDecoratorラッパーが呼び出されたときに、それが呼び出されているインスタンスが何であるかは分かりません(つまり、selfにする必要があります)。

AddDecoratorクラスに記述子プロトコルを実装するには、__get__メソッドを指定します。あなたが書くとき

def addCalled(func): 
    def newFunc(*args, **kwargs): 
     newFunc.called = True 
     func(*args, **kwargs) 
    newFunc.called = False 
    return newFunc 
-1

def bet(self, betsize): 
    print(betsize) 

bet = AddCalled(bet) 

ので、AddCalledに渡される引数は次のとおりです。

@AddCalled 
def bet(self, betsize): 
    print(betsize) 

これはと等価であるか、あなただけの機能を使用して、通常のデコレータを書くことができbet機能です。

+0

何が起こったのですか?あなたの投稿を読んでいる途中で、それを削除しました:/ – khanh

+0

間違っていたので削除しました –

+0

@BrenBarnの解決策は正しいです。私はスネークケースの関数名を好む以外は;-)。私はまた、あなたがコールにどのようにフラグを立てるかについてのそのコメントに同意する。 –

関連する問題