簡體   English   中英

擴展SocketServer.TCPServer時,Python“實例沒有屬性”錯誤

[英]Python “instance has no attribute” error when extending SocketServer.TCPServer

我試圖覆蓋SocketServer.TCPServer類的serve_forever方法。 但是我得到一個AttributeError: MyServer instance has no attribute '_MyServer__is_shut_down'錯誤。

__is_shut_downSocketServer.BaseServer類中實現,應該通過SocketServer.TCPServer __init__()初始化。 我錯過了什么?

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()

根據定義,以兩個下划線開頭的變量對於給定的類是“私有的”。 實際上,這意味着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__']

雙重下划線的值在它們聲明或引用的范圍內被self._BaseServer__is_shut_down標記。您需要引用self._BaseServer__is_shut_down (以及self._BaseServer__shutdown_request )或者從派生類范圍中的基類作用域中對該屬性進行別名。

@isedev有一個關於避免直接與dunderscored偽私密互動的觀點。 除非您迫切需要通過請求偵聽器檢測每個循環, _handle_request_noblock最好覆蓋_handle_request_noblock ,這仍然可以讓您檢測在單個點處理的每個請求,但不必直接與服務器狀態交互。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM