[英]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_down
在SocketServer.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.