扩展SocketServer.TCPServer时,Python“实例没有属性”错误

时间:2014-02-18 19:22:57

标签: python socketserver

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

__is_shut_down已在SocketServer.BaseServer课程中实施,应通过__init__()的{​​{1}}进行初始化。我错过了什么?

SocketServer.TCPServer

2 个答案:

答案 0 :(得分:5)

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

因此,__is_shut_down中定义的SocketServer.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__']

答案 1 :(得分:2)

双重下划线的值在它们声明或引用的范围内被严格标记。您需要引用self._BaseServer__is_shut_down(和self._BaseServer__shutdown_request)或者别名来自基类范围的属性。派生类范围。

@isedev有一个关于避免直接与dunderscored伪私密进行交互的观点。除非您迫切需要通过请求侦听器检测每个循环,否则最好覆盖_handle_request_noblock,这仍然可以让您检测在单个点处理的每个请求,但无需直接交互与服务器状态。