为了账号安全,请及时绑定邮箱和手机立即绑定

什么情况下类成员函数不把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.
    (...)

这是一个已知的错误,尽管围绕它的修复方式进行了一些讨论,但还是被关闭了。

仍然很想知道这个问题是如何出现的。

我想这是一个尝试错误修复的诚实错误。由于没有针对您的特定场景进行测试,因此没有被捕获。

//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 关注
  • 278 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信