Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/333.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 为什么不是';你没有被解雇吗?_Python_Class_Oop_Constructor - Fatal编程技术网

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

我对Python还相当陌生,目前我正在运行一些示例来了解事情是如何工作的,但我被困在其中一个步骤中

我有一个包含几个属性的类,还有一个
\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