python类方法在调用时发生投诉

2024-05-28 21:13:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个类方法:

class MyServerProtocol(WebSocketServerProtocol):

    @classmethod
    def send(cls, text):
        cls.sendMessage(cls, text)

    def onMessage(self, payload, isBinary):
        msp=MyServerProtocol
        msp.send('test')

我试图调用这个classmethod(暂时作为一个测试,在类中),我得到:

^{pr2}$

它期待着一个实例,并抱怨它得到了一个实例。。。任何人都知道如何正确地称呼它。一旦我开始工作,我就可以在另一个类中进行测试,只想在迁移之前先让它工作。在

编辑:

我修改了我的代码来调用如下方法,但它现在仍然在工作。在

^{3}$

从高速公路发送的消息如下所示,在传递self之后,我收到一个断言错误:

def sendMessage(self,
                payload,
                isBinary=False,
                fragmentSize=None,
                sync=False,
                doNotCompress=False):
    """
    Implements :func:`autobahn.websocket.interfaces.IWebSocketChannel.sendMessage`
    """
    assert(type(payload) == bytes)

    if self.state != WebSocketProtocol.STATE_OPEN:
        return

    if self.trackedTimings:
        self.trackedTimings.track("sendMessage")

    # (initial) frame opcode
    #
    if isBinary:
        opcode = 2
    else:
        opcode = 1

    self.trafficStats.outgoingWebSocketMessages += 1

    # setup compressor
    #
    if self._perMessageCompress is not None and not doNotCompress:
        sendCompressed = True

        self._perMessageCompress.startCompressMessage()

        self.trafficStats.outgoingOctetsAppLevel += len(payload)

        payload1 = self._perMessageCompress.compressMessageData(payload)
        payload2 = self._perMessageCompress.endCompressMessage()
        payload = b''.join([payload1, payload2])

        self.trafficStats.outgoingOctetsWebSocketLevel += len(payload)

    else:
        sendCompressed = False
        l = len(payload)
        self.trafficStats.outgoingOctetsAppLevel += l
        self.trafficStats.outgoingOctetsWebSocketLevel += l

    # explicit fragmentSize arguments overrides autoFragmentSize setting
    #
    if fragmentSize is not None:
        pfs = fragmentSize
    else:
        if self.autoFragmentSize > 0:
            pfs = self.autoFragmentSize
        else:
            pfs = None

    # send unfragmented
    #
    if pfs is None or len(payload) <= pfs:
        self.sendFrame(opcode=opcode, payload=payload, sync=sync, rsv=4 if sendCompressed else 0)

    # send data message in fragments
    #
    else:
        if pfs < 1:
            raise Exception("payload fragment size must be at least 1 (was %d)" % pfs)
        n = len(payload)
        i = 0
        done = False
        first = True
        while not done:
            j = i + pfs
            if j > n:
                done = True
                j = n
            if first:
                self.sendFrame(opcode=opcode, payload=payload[i:j], fin=done, sync=sync, rsv=4 if sendCompressed else 0)
                first = False
            else:
                self.sendFrame(opcode=0, payload=payload[i:j], fin=done, sync=sync)
            i += pfs

    # if self.debug:
    #   self.log.debug("Traffic statistics:\n" + str(self.trafficStats))

Tags: selfnonesendfalselenifsyncelse
2条回答

这个错误不能用最小的示例重现,但它似乎在说sendMessage()不是一个类方法。在不传递实例本身的情况下,不能从类方法调用实例方法。在

尝试为send()添加另一个参数,该参数将保存实例,然后将self传入该参数。比如:

class MyServerProtocol(WebSocketServerProtocol):

    @classmethod
    def send(cls, self, text):
        self.sendMessage(text)

    def onMessage(self, payload, isBinary):
        msp=MyServerProtocol
        msp.send(self, 'test')

不过在这一点上,您也可以将send()作为一个实例方法。在

sendMessage看起来像是一个实例方法,需要将它绑定到实例上,为了说明,下面应该可以工作:

class MyServerProtocol(WebSocketServerProtocol):

    def onMessage(self, payload, isBinary):
        msp=MyServerProtocol
        self.sendMessage('test')

相关问题 更多 >

    热门问题