Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python“;实例没有属性";扩展SocketServer.TCPServer时出错_Python_Socketserver - Fatal编程技术网

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
运行你的程序),即使你一直在使用制表符,也要切换到四个空格的缩进。