Python“;实例没有属性";扩展SocketServer.TCPServer时出错
我试图覆盖Python“;实例没有属性";扩展SocketServer.TCPServer时出错,python,socketserver,Python,Socketserver,我试图覆盖SocketServer.TCPServer类的serve\u永方法。然而,我得到了一个属性错误:MyServer实例没有属性“\u MyServer\u是\u shutt\u down”错误 \uuu是关闭的在SocketServer.BaseServer类中实现,应该通过SocketServer.TCPServer的\uuu init\uuu()进行初始化。我错过了什么 import SocketServer class MyServer(SocketServer.TCPServ
SocketServer.TCPServer
类的serve\u永
方法。然而,我得到了一个属性错误:MyServer实例没有属性“\u MyServer\u是\u shutt\u down”
错误
\uuu是关闭的
在SocketServer.BaseServer
类中实现,应该通过SocketServer.TCPServer
的\uuu init\uuu()进行初始化。我错过了什么
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.\u BaseServer\u是\u shutdown
(和self.\u BaseServer\u shutdown\u request
),或在派生类范围中为基类范围的属性别名
@不过,isedev有一个观点,即避免直接与Dunders伪私密者进行交互。除非您迫切需要通过请求侦听器检测每一个循环,否则覆盖\u handle\u request\u noblock
可能会更好,它仍然允许您检测在单个点处理的每个请求,但不必直接与服务器状态交互。根据定义,以两个下划线开头的变量对于给定的类是“私有”的。实际上,这意味着Python通过添加下划线、定义类名和实际变量名来破坏变量名
因此,\u是关闭的
,在SocketServer.BaseServer
中定义,实际上被称为\u BaseServer\u是关闭的
您是否应该实际使用它是另一个问题,因为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__']
A类(对象):
定义初始化(自):
self.\uuu my\u变量=1
a=a()
处长(a)
[''你是我的变量,试试super(MyServer,self)。\uuu init\uuuu
旁白:你的缩进看起来很奇怪。你应该确保你没有混合制表符和空格(使用python-tt
运行你的程序),即使你一直在使用制表符,也要切换到四个空格的缩进。