亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

什么情況下類成員函數不把self作為第一個參數傳入?

什么情況下類成員函數不把self作為第一個參數傳入?

一只斗牛犬 2021-11-23 16:28:22
問題我正在使用一個庫來促進客戶端與服務器的 websocket 通信。websocket 庫允許您指定套接字打開、關閉、錯誤或接收消息時的回調函數如果我將我的回調函數設置為另一個類的實例函數,那么在調用它們時需要傳遞self參數。我明白,如果你調用一個類實例方法,它總是將 self 作為第一個參數傳遞。但是,我的回調沒有通過自我例如from websocket import WebSocketAppimport websocketclass X(object):    def run(self):        self.ws  = WebSocketApp('wss://api.bitfinex.com/ws/2'                            ,on_open=self.on_open                            ,on_message=self.on_message                            ,on_error=self.on_error                            ,on_close=self.on_close)        websocket.enableTrace(True)        self.ws.run_forever()    def on_open(self, ws):        print('open')    def on_close(self, ws):        print('close')    def on_message(self, ws, message):        print('message')    def on_error(self, ws, error):        print('error')if __name__=='__main__':    x = X().run()輸出error from callback <bound method X.on_open of <__main__.X object at 0x7fd7635e87f0>>: on_open() missing 1 required positional argument: 'ws'  File "/home/arran/.local/lib/python3.6/site-packages/websocket/_app.py", line 343, in _callbackcallback(*args)我可能在這里遺漏了一些基本的東西。但任何幫助將不勝感激
查看完整描述

2 回答

?
慕碼人8056858

TA貢獻1803條經驗 獲得超6個贊

我可能在這里遺漏了一些基本的東西。

不,你是對的。但是,on_open回調不會被ws參數調用,盡管它應該根據文檔:

class WebSocketApp(object):
    (...)
        on_open: callable object which is called at opening websocket.
          this function has one argument. The argument is this class object.
    (...)

這是一個已知的錯誤,盡管圍繞它的修復方式進行了一些討論,但還是被關閉了。

仍然很想知道這個問題是如何出現的。

我想這是一個嘗試錯誤修復的誠實錯誤。由于沒有針對您的特定場景進行測試,因此沒有被捕獲。

http://img1.sycdn.imooc.com//619ca65300012ba015860313.jpg

我已降級到早期版本并解決了我的問題


請提交錯誤報告或編寫拉取請求以解決問題。


我的理解是類實例方法總是將 self 作為第一個參數傳遞


是的,你的理解是正確的。這是一個反映您嘗試過的示例。


class Server(object):

    def __init__(self, callback):

        self.callback = callback


    def run(self):

        self.callback(5)


class Client(object):

    def on_message(self, n):

        print("got", n)


client = Client()

server = Server(client.on_message)

server.run()


查看完整回答
反對 回復 2021-11-23
?
吃雞游戲

TA貢獻1829條經驗 獲得超7個贊

看起來是 WebSocket 類沒有傳遞您的 on_open 方法期望的 ws 參數的問題。我試圖用我自己的虛擬類重現它,它工作正常。


class WS:

    def __init__(self, on_call):

        self.on_call = on_call

    def call(self):

        print("hi")

        self.on_call(self)



class X:

    def on_call(self, ws):

        print(ws)

    def run(self):

        self.ws = WS(self.on_call)

        self.ws.call()


X().run()

hi

<__main__.WS instance at 0x029AB698>


查看完整回答
反對 回復 2021-11-23
  • 2 回答
  • 0 關注
  • 342 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號