2017-02-27 56 views
-1
class TCPHandler(socketserver.BaseRequestHandler): 
    def setup(self):  
     self.packer = MessagePacker.MessagePacker() 
     self.parser = MessageParser.MessageParser() 

    def handle(self):   
     self.setup() 
     while True: 
      pass 
      #blabla... 

class FroggerServer(threading.Thread): 
    def init(self,ip,nickname): 
     self.serverIp = ip 
     self.serverPort = 10000 
     self.nickname = nickname 
     self.tcpHandler = TCPHandler 
     tuple = (self.serverIp,self.serverPort)    
     self.__serverSocket = socketserver.TCPServer(tulpe,self.tcpHandler) 

    def run(self): 
     self.__serverSocket.serve_forever() 

我用套接字然後釋放TCPHandler。 問題是在TCPHandler中找不到'packer','parser'。爲什麼它無法在類中找到對象(python)

對於eaxmple,像這樣。

server = FroggerServer() 
server.init(ip,nickname) 
server.start() 
server.parser.putMessage(43) #oops. not exist object parser in server object 

我認爲存在self.tcpHandler = TCPHandler問題,如果我不使用這種方式,我怎樣才能在外部訪問的對象在TCPHandler該類

+1

'server'沒有'parser'屬性。 'sever'確實有你可能想要使用的'tcpHandler'屬性。 –

+0

server.tcpHandler.parser.putMessage(43)將起作用,但下面的@WasiAhmad答案最適合你。 – aslavkin

+0

首先我將'self.tcpHandler = TCPHandler'修正爲'self.tcpHandler = TCPHandler()'。然後我按照你的說法放置構造函數。 thansk你的評論(_ _) –

回答

1

你可以做這樣的事情。

class TCPHandler(socketserver.BaseRequestHandler): 
    def setup(self):  
     self.packer = MessagePacker.MessagePacker() 
     self.parser = MessageParser.MessageParser() 

    def handle(self):   
     self.setup() 
     # your code 

    def getPacker(): 
     return self.packer 

    def getParser(): 
     return self.parser 

class FroggerServer(threading.Thread): 
    def init(self,ip,nickname): 
     # your code 

    def run(self): 
     self.__serverSocket.serve_forever() 

    def getTCPHandler(): 
     return self. tcpHandler 

然後,你可以這樣做:

server = FroggerServer() 
server.init(ip,nickname) 
server.start() 
server.getTCPHandler().getParser().putMessage(43) 

替代做法:你可以做以下的爲好。

class TCPHandler(socketserver.BaseRequestHandler): 
    def __init__(self):  
     self.packer = MessagePacker.MessagePacker() 
     self.parser = MessageParser.MessageParser() 

    def handle(self): 
     while True: 
      pass 
      #blabla... 

class FroggerServer(threading.Thread): 
    def __init__(self, ip, nickname): 
     self.serverIp = ip 
     self.serverPort = 10000 
     self.nickname = nickname 
     self.tcpHandler = TCPHandler() 
     tuple = (self.serverIp, self.serverPort)    
     self.__serverSocket = socketserver.TCPServer(tulpe, self.tcpHandler) 

    def run(self): 
     self.__serverSocket.serve_forever() 

現在按如下方式創建您的服務器對象。您現在可以訪問TCPHandler類的變量parser

server = FroggerServer(ip, nickname) 
server.start() 
server.tcpHandler.parser.putMessage(43) 

Why the above will work?

假設你有下面的類。

class Example(object): 
     def doSomething(self): 
      self.othervariable = 'instance variable' 

>> foo = Example() 

在這裏,我們創建了Example的實例,但是,如果我們試圖訪問othervariable我們會得到一個錯誤:

>> foo.othervariable 
AttributeError: 'Example' object has no attribute 'othervariable' 

由於othervariable分配內部doSomething,我們還沒有把它稱爲呢,它不存在。

>> foo.doSomething() 
>> foo.othervariable 
'instance variable' 

請注意,__init__是一種特殊的方法,只要發生類實例化就會自動調用。

class Example(object): 
     def __init__(self): 
      self.othervariable = 'instance variable' 

>> foo = Example() 
>> foo.othervariable 
'instance variable' 

參考:https://stackoverflow.com/a/16680307/5352399

相關問題