gpt4 book ai didi

python - 如何使装饰器函数成为类的一部分

转载 作者:太空宇宙 更新时间:2023-11-04 11:20:19 25 4
gpt4 key购买 nike

我想让函数成为我正在构建的类的一部分,但是我得到一个错误可能是装饰器函数将是部门中的函数的问题。有解决问题的方法吗?谢谢。

import engineio

class Websocket:

def __init__(self):
self.eio = engineio.Client()
self.eio.connect('http://localhost:5000')
self.eio.wait()

# get error in this function
@eio.on('connect')
def on_connect():
print('connection established')

最佳答案

您不能在装饰器表达式引用实例属性的方法上使用装饰器。这是因为装饰器在创建它们装饰的函数时执行。在 class 里面声明体,这意味着当应用装饰器时,还没有类,没有类,也不可能有任何实例。

你有两个选择:

  • 只需调用 self.eio.on('connect')__init__你的类(class),传递一个绑定(bind)方法:

    class Websocket:

    def __init__(self):
    self.eio = engineio.Client()
    self.eio.connect('http://localhost:5000')
    self.eio.on('connect', self.on_connect)
    # don't call wait, see below

    def on_connect(self):
    print('connection established')

    这是可行的,因为到时候 __init__被称为你有一个类和该类的一个实例(由 self 引用),并且 self.on_connect返回对绑定(bind)方法的引用(调用它将传入 self)。 @....装饰器语法只是语法糖,您不必使用它。 engineio.Client.on() method接受处理程序作为第二个参数,但您也可以使用 self.eio.on('connect')(self.on_connect) ,这是装饰器语法的直译。

  • __init__ 中使用嵌套函数,并装饰它:

    class Websocket:

    def __init__(self):
    self.eio = engineio.Client()
    self.eio.connect('http://localhost:5000')

    @self.eio.on('connect')
    def on_connect():
    print('connection established')

    # don't call wait, see below


    but that makes it much harder to use that function directly from other code.

请注意 engineio.Client.wait() method block ,它不会返回,直到连接结束。你通常不会把那种电话放在 __init__ 中。一个类的方法!

使用一个类来处理engineio事件很棒,但不要从类中启动客户端连接。我会这样做:

class Websocket:
def __init__(self, socket_url):
self.eio = engineio.Client()
self.eio.connect(socket_url)
self.eio.on('connect', self.on_connect)
# other registrations

def on_connect(self):
# handle connection

# other handlers

def wait(self):
self.eio.wait()

websocket = Websocket('http://localhost:5000)
websocket.wait()

关于python - 如何使装饰器函数成为类的一部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56128018/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com