为什么它无法在类中找到对象(python)

时间:2017-02-27 07:50:07

标签: python

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中的对象

1 个答案:

答案 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'

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