2016-09-16 4 views
0

데코레이터를 사용하여 메소드에 속성을 추가하여 호출되었는지 확인하려고합니다. 내가 왜이 오류있어 알아낼 수 없다 : TypeError : bet() missing 1 required position argument : '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

덧붙여 말하면, 메서드에 속성을 저장하면 메서드에 의해 호출 될 때 한 번만 설정됩니다. 게임의 주어진 인스턴스에서'bet '이 호출되었는지 여부는 알려주지 않습니다. 이 문제가'called' 속성을 어떻게 사용할 것인지에 달려 있습니다. – BrenBarn

+0

오, 죄송합니다. 실제로 제 코드에 잘 쓰여 있습니다. 나는 방금 그것을 편집했다 @ BrenBarn – khanh

답변

2

장식가가 포장 된 기능에 제대로 self을 전달하지 않습니다.

일반적으로 self은 함수 개체의 설명자 메커니즘에 의해 추가되어 self이 삽입 된 메서드 개체로 변환됩니다. 그러나 설명자 프로토콜을 구현하지 않는 AddDecorator 개체로 메서드를 대체했습니다. 따라서 AddDecorator 래퍼가 호출되면 어떤 인스턴스가 호출되는지 알 수 없습니다 (즉, self이어야 함).

__get__ 메서드를 사용하여 AddDecorator 클래스에 설명자 프로토콜을 구현할 수 있습니다. 당신이 쓸 때

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의 해결책은 정확합니다. 나는 뱀 케이스 함수 이름을 선호한다는 것을 제외하고는 ;-). 또한 통화 신고 방법에 대한 의견에 동의합니다. –

관련 문제