で私は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()
次に、サーバーオブジェクトを次のように作成します。変数parser
にTCPHandler
のクラスにアクセスできるようになりました。
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'
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
'server'は' parser'属性を持っていません。 'sever'はおそらくあなたが使いたい' tcpHandler'属性を持っています。 –
server.tcpHandler.parser.putMessage(43)は動作しますが、以下の@WasiAhmadの回答が最適です。 – aslavkin
最初に 'self.tcpHandler = TCPHandler ='を 'self.tcpHandler = TCPHandler()'に修正しました。あなたが言うようにコンストラクタを配置します。あなたのコメントをお忘れなく(_ _) –