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()
我使用socket然后选择TCPHandler。 问题是找不到包装工具'解析器'在TCPHandler中。
对于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中的对象
答案 0 :(得分: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()
现在按如下方式创建服务器对象。您现在可以访问parser
类的变量TCPHandler
。
server = FroggerServer(ip, nickname)
server.start()
server.tcpHandler.parser.putMessage(43)
为什么上述方法有效?
假设您有以下课程。
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'