我试图覆盖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()
最佳答案
双下划线的值在声明或引用它们的范围内被名称损坏您需要在派生类作用域中引用self._BaseServer__is_shut_down
(以及self._BaseServer__shutdown_request
)或为基类作用域中的属性命名。
@尽管如此,ISedev有一个避免与邓德尔科德的伪私密者直接交互的观点。除非您迫切需要通过请求侦听器检测每个循环,否则最好覆盖_handle_request_noblock
,这样仍然可以检测在单个点处理的每个请求,但不必直接与服务器状态交互。
关于python - 扩展SocketServer.TCPServer时,Python“实例无属性”错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21863391/