什么情况下类成员函数不把self作为第一个参数传入?

问题

我正在使用一个库来促进客户端与服务器的 websocket 通信。

  • websocket 库允许您指定套接字打开、关闭、错误或接收消息时的回调函数

  • 如果我将我的回调函数设置为另一个类的实例函数,那么在调用它们时需要传递self参数。

  • 我明白,如果你调用一个类实例方法,它总是将 self 作为第一个参数传递。但是,我的回调没有通过自我

例如

from websocket import WebSocketApp

import websocket

class 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 _callback

callback(*args)

我可能在这里遗漏了一些基本的东西。但任何帮助将不胜感激


一只斗牛犬
浏览 284回答 2
2回答

慕码人8056858

我可能在这里遗漏了一些基本的东西。不,你是对的。但是,on_open回调不会被ws参数调用,尽管它应该根据文档:class&nbsp;WebSocketApp(object): &nbsp;&nbsp;&nbsp;&nbsp;(...) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;on_open:&nbsp;callable&nbsp;object&nbsp;which&nbsp;is&nbsp;called&nbsp;at&nbsp;opening&nbsp;websocket. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this&nbsp;function&nbsp;has&nbsp;one&nbsp;argument.&nbsp;The&nbsp;argument&nbsp;is&nbsp;this&nbsp;class&nbsp;object. &nbsp;&nbsp;&nbsp;&nbsp;(...)这是一个已知的错误,尽管围绕它的修复方式进行了一些讨论,但还是被关闭了。仍然很想知道这个问题是如何出现的。我想这是一个尝试错误修复的诚实错误。由于没有针对您的特定场景进行测试,因此没有被捕获。我已降级到早期版本并解决了我的问题请提交错误报告或编写拉取请求以解决问题。我的理解是类实例方法总是将 self 作为第一个参数传递是的,你的理解是正确的。这是一个反映您尝试过的示例。class Server(object):&nbsp; &nbsp; def __init__(self, callback):&nbsp; &nbsp; &nbsp; &nbsp; self.callback = callback&nbsp; &nbsp; def run(self):&nbsp; &nbsp; &nbsp; &nbsp; self.callback(5)class Client(object):&nbsp; &nbsp; def on_message(self, n):&nbsp; &nbsp; &nbsp; &nbsp; print("got", n)client = Client()server = Server(client.on_message)server.run()

吃鸡游戏

看起来是 WebSocket 类没有传递您的 on_open 方法期望的 ws 参数的问题。我试图用我自己的虚拟类重现它,它工作正常。class WS:&nbsp; &nbsp; def __init__(self, on_call):&nbsp; &nbsp; &nbsp; &nbsp; self.on_call = on_call&nbsp; &nbsp; def call(self):&nbsp; &nbsp; &nbsp; &nbsp; print("hi")&nbsp; &nbsp; &nbsp; &nbsp; self.on_call(self)class X:&nbsp; &nbsp; def on_call(self, ws):&nbsp; &nbsp; &nbsp; &nbsp; print(ws)&nbsp; &nbsp; def run(self):&nbsp; &nbsp; &nbsp; &nbsp; self.ws = WS(self.on_call)&nbsp; &nbsp; &nbsp; &nbsp; self.ws.call()X().run()hi<__main__.WS instance at 0x029AB698>
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python