扩展SocketServer.TCPServer时出现Python“实例无属性”错误

gre*_*ole 3 python socketserver

我正在尝试覆盖该类的serve_forever方法SocketServer.TCPServer。但是我收到一个AttributeError: MyServer instance has no attribute '_MyServer__is_shut_down'错误。

__is_shut_down在实现SocketServer.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()
Run Code Online (Sandbox Code Playgroud)

ise*_*dev 5

根据定义,以两个下划线开头的变量是给定类的“私有”变量。实际上,这意味着Python通过添加下划线,后跟定义的类名和实际的变量名来修饰变量名。

因此__is_shut_downSocketServer.BaseServer实际上定义为_BaseServer__is_shut_down

您是否应该实际使用它是另一个问题,因为BaseServer显然是不打算使用它的作者。

一个例子:

class A(object):
    def __init__(self):
        self.__my_variable = 1

a = A()

dir(a)
['_A__my_variable',   <== mangled variable name
 '__class__',
 '__delattr__',
 '__dict__',
 '__doc__',
 '__format__',
 '__getattribute__',
 '__hash__',
 '__init__',
 '__module__',
 '__new__',
 '__reduce__',
 '__reduce_ex__',
 '__repr__',
 '__setattr__',
 '__sizeof__',
 '__str__',
 '__subclasshook__',
 '__weakref__']
Run Code Online (Sandbox Code Playgroud)