我正在尝试覆盖serve_forever
类的SocketServer.TCPServer
方法。但是我收到AttributeError: MyServer instance has no attribute '_MyServer__is_shut_down'
错误。
__is_shut_down
已在SocketServer.BaseServer
课程中实施,应通过__init__()
的{{1}}进行初始化。我错过了什么?
SocketServer.TCPServer
答案 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
,这仍然可以让您检测在单个点处理的每个请求,但无需直接交互与服务器状态。