2017-02-27 6 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で 'パッカー'、 'パーサー'を見つけることができません。クラス(Python)でオブジェクトを見つけることができないのはなぜですか?

このように、eaxmpleでは、

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

私はあなたがこのような何かを行うことができ、このクラスの外

+1

'server'は' parser'属性を持っていません。 'sever'はおそらくあなたが使いたい' tcpHandler'属性を持っています。 –

+0

server.tcpHandler.parser.putMessage(43)は動作しますが、以下の@WasiAhmadの回答が最適です。 – aslavkin

+0

最初に 'self.tcpHandler = TCPHandler ='を 'self.tcpHandler = TCPHandler()'に修正しました。あなたが言うようにコンストラクタを配置します。あなたのコメントをお忘れなく(_ _) –

答えて

1

で私はTCPHandlerのオブジェクトにアクセスするにはどうすればよい、私はこの方法を使用していけない場合self.tcpHandler = TCPHandlerに問題があると思いました。

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() 

次に、サーバーオブジェクトを次のように作成します。変数parserTCPHandlerのクラスにアクセスできるようになりました。

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() 

我々はothervariableにアクセスしようとした場合しかし、我々はエラーになります、Exampleのインスタンスを作成:、

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

othervariabledoSomething内部で割り当てられ、我々はまだそれを呼び出していないので、それは存在しない。

>> 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

関連する問題