Python 为什么不是';你没有被解雇吗?
我对Python还相当陌生,目前我正在运行一些示例来了解事情是如何工作的,但我被困在其中一个步骤中 我有一个包含几个属性的类,还有一个Python 为什么不是';你没有被解雇吗?,python,class,oop,constructor,Python,Class,Oop,Constructor,我对Python还相当陌生,目前我正在运行一些示例来了解事情是如何工作的,但我被困在其中一个步骤中 我有一个包含几个属性的类,还有一个\uuuu init\uuuuu(self)构造函数,类似这样: class A: # Some attributes here a = None; b = None; ... def __init__(self): # Do some stuff here 此外,我还有另一个类继承自两个类:上面的A和SocketServer.Ba
\uuuu init\uuuuu(self)
构造函数,类似这样:
class A:
# Some attributes here
a = None;
b = None;
...
def __init__(self):
# Do some stuff here
此外,我还有另一个类继承自两个类:上面的A
和SocketServer.BaseRequestHandler
()
基本上,这将在收到TCP请求后触发handle()
方法,但我的问题要简单得多。当我声明TCPHandler
对象时,我是这样做的:
server = SocketServer.TCPServer('localhost', 9191), TCPHandler)
server.serve_forever()
然而,这似乎是在尝试用4个参数调用A
class'构造函数(我假定SocketServer.BaseRequestHandler
有):
因此,在A
中,我添加了另一个具有4个参数的构造函数:
def __init__(self, a=None, b=None, c=None, d=None):
# Do some other stuff here
现在这个构造函数似乎被触发了,但是,RequestHandler.handle()
方法永远不会在到达的TCP连接上被调用
为什么在这种情况下从未调用handle()
方法
----编辑---
这将是一个简短而完整的程序,可以说明我解释的行为:
import sys
import SocketServer
class A:
a = ''
b = ''
c = ''
def load_config(self):
a = 'a'
b = 'b'
c = 'c'
def __init__(self):
self.load_config()
def __init__(self, server_address, RequestHandlerClass, bind_and_activate=True, debug=True):
self.load_config()
class TCPHandler(A, SocketServer.BaseRequestHandler):
def handle(self):
print "I reached handle()!!"
if __name__ == "__main__":
server = SocketServer.TCPServer(('localhost', 9999), TCPHandler)
server.serve_forever()
- 如果没有添加5参数构造函数,将显示上面的错误
- 如果添加了5参数构造函数,
I到达handle()代码>消息从未显示(因此,
未被触发)handle()
def __init__(self, a=None, b=None, c=None, d=None):
# Do some other stuff here
它可能应该这样做:
def __init__(self, a=None, b=None, c=None, d=None):
A.__init__(self)
SocketServer.BaseRequestHandler.__init__(self, a, b, c, d)
# Do some other stuff here
您的程序失败,因为这里的
执行其他操作
是错误的。你应该多做些别的事情。:)请创建一个简短、完整的程序来演示您遇到的错误。另请注意,在您编辑的示例中,python不会重载方法。第二个\uuuuuuu init\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。因此,假设现在我有另一个继承自A
的类,我不能调用新的\uuuu init\uuuuu
方法,因为它将实例化SocketServer.BaseRequestHandler
对象。我可能会使另一个方法仅作为“启动器”从这个新类调用。@nKn如果从继承,则希望该类调用init,因为您也希望初始化BaseRequestHandler。但是你计划用一个替代的初始值设定项是合理的。如果有人想编辑我的答案,包括对super()
的引用,请随意。谢谢,这很有效。但是,我无法完全理解为什么要显式地调用SocketServer.BaseRequestHandler
的构造函数(可能我对其他语言太熟悉了:-()我的意思是,TCPHandler
继承自A
和SocketServer.BaseRequestHandler
,对吗?构造函数不应该一个接一个地隐式调用吗?即使它现在可以工作了,我也添加了一个简短完整的程序来说明我的意思(也许它可以帮助其他人)@nKn在Python中,必须显式调用基类的\uuu init\uuu
。
def __init__(self, a=None, b=None, c=None, d=None):
# Do some other stuff here
def __init__(self, a=None, b=None, c=None, d=None):
A.__init__(self)
SocketServer.BaseRequestHandler.__init__(self, a, b, c, d)
# Do some other stuff here