2016-01-29 59 views
1

我有一類方法:蟒類方法抱怨的時候叫

class MyServerProtocol(WebSocketServerProtocol): 

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

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

我想調用這個類方法(如測試現在,從類中)和我得到:

exceptions.TypeError: unbound method sendMessage() must be called with MyServerProtocol instance as first argument (got type instance instead) 

它期待一個實例並抱怨它有一個實例...任何人都知道如何正確地調用它。一旦我得到它的工作,我可以從另一個課程中進行測試,只是想在遷移之前先讓它工作。

編輯:

我已經修改我的代碼調用的方法如下,但它仍然是現在的工作。從高速公路

class MyServerProtocol(WebSocketServerProtocol): 

    def onMessage(self, payload, isBinary): 

     myInput = literal_eval(payload) 
     cg = coreg.DataGatherCg() 
     cg.test(myInput, self) 


    def send(self, text): 
     self.sendMessage(text) 

class DataGatherCg(): 

    def test(self, myInput, obj): 
     obj.send(myInput) 

SendMessage函數如下所示,通過自後我得到一個AssertionError:

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)) 
+1

您需要顯示'sendMessage'的定義,因爲這是引發錯誤的方法。 – BrenBarn

回答

1

sendMessage看起來它是一個實例方法,要求它綁定到一個實例,來說明,下面應該工作:

class MyServerProtocol(WebSocketServerProtocol): 

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

如何在該類之外調用sendMessage? – user1601716

+0

你需要一個具有'sendMessage'的事件的引用,你可以傳遞自我? – dm03514

+0

試過了,我至少得到了一個不同的錯誤,現在我得到一個'exceptions.AssertionError'斷言在autobahn/websocket/protocol.py中調用 – user1601716

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()一個實例方法。

+0

反而沒有工作,抱怨str實例。基本上我的目標是在其他類中使用self.sendMessage('stuff'),但我無法做到這一點 – user1601716

+0

但是,該消息將發送到哪裏?是否有一個具有'sendMessage()'方法的服務器連接?如果是這樣的話,你正在尋找一個單身人士。 – kichik