我试图覆盖serve_forever类的SocketServer.TCPServer方法但是我得到了一个AttributeError: MyServer instance has no attribute '_MyServer__is_shut_down'错误。
__is_shut_downSocketServer.BaseServer类中实现,应该通过__init__()SocketServer.TCPServer初始化。我错过了什么?

import SocketServer

class MyServer(SocketServer.TCPServer):

    def __init__(self, server_address, RequestHandlerClass):
            SocketServer.TCPServer.__init__(self, server_address,
                                             RequestHandlerClass)

    def serve_forever(self, poll_interval=0.5):
        self.__is_shut_down.clear()
        try:
            while not self.__shutdown_request:
                 print "SOMETHING"
                 r, w, e = _eintr_retry(select.select, [self], [], [],
                                       poll_interval)
                 if self in r:
                   self._handle_request_noblock()
        finally:
            self.__shutdown_request = False
            self.__is_shut_down.set()

最佳答案

双下划线的值在声明或引用它们的范围内被名称损坏您需要在派生类作用域中引用self._BaseServer__is_shut_down(以及self._BaseServer__shutdown_request)或为基类作用域中的属性命名。
@尽管如此,ISedev有一个避免与邓德尔科德的伪私密者直接交互的观点。除非您迫切需要通过请求侦听器检测每个循环,否则最好覆盖_handle_request_noblock,这样仍然可以检测在单个点处理的每个请求,但不必直接与服务器状态交互。

关于python - 扩展SocketServer.TCPServer时,Python“实例无属性”错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21863391/

10-09 16:45