Python继承:TypeError:object .__ init __()不带参数


90

我收到此错误:

TypeError: object.__init__() takes no parameters 

在运行代码时,我在这里看不到自己在做什么错:

class IRCReplyModule(object):

    activated=True
    moduleHandlerResultList=None
    moduleHandlerCommandlist=None
    modulename=""

    def __init__(self,modulename):
        self.modulename = modulename


class SimpleHelloWorld(IRCReplyModule):

     def __init__(self):
            super(IRCReplyModule,self).__init__('hello world')

Answers:


115

您在super()调用中调用了错误的类名:

class SimpleHelloWorld(IRCReplyModule):

     def __init__(self):
            #super(IRCReplyModule,self).__init__('hello world')
            super(SimpleHelloWorld,self).__init__('hello world')

本质上,您要解决的是__init__不带参数的对象基类的。

我知道,必须指定您已经在其中的类有点多余,这就是为什么在python3中可以这样做: super().__init__()


4
@LucasKauffman:其实我并不认为它很愚蠢。这很容易成为一个令人困惑的概念。我不怪你
jdi 2012年

4
冒犯许多Python专家的风险:恕我直言,这是糟糕的语言设计。谢谢您对@jdi的帮助!
Johannes Fahrenkrug,2015年

4
@JohannesFahrenkrug-我认为您不会冒犯任何人,因为它被认为是不良设计并已在python3中修复:docs.python.org/3/library/functions.html#super
jdi

3

这最近让我痛苦了两次(我知道我应该是第一次从我的错误中吸取教训),而且被接受的答案两次都没有帮助过我,所以尽管我脑海中浮现出新的想法,但我想我还是会提交自己的答案,以防万一其他人都会遇到这个问题(或者将来我会再次需要它)。

在我的情况下,问题是我在子类的初始化中传递了一个kwarg,但是在超类中,然后将arg传递给了super()调用。

我始终以以下示例为例,认为这类事情是最好的:

class Foo(object):
  def __init__(self, required_param_1, *args, **kwargs):
    super(Foo, self).__init__(*args, **kwargs)
    self.required_param = required_param_1
    self.some_named_optional_param = kwargs.pop('named_optional_param', None)

  def some_other_method(self):
    raise NotImplementedException

class Bar(Foo):
  def some_other_method(self):
    print('Do some magic')


Bar(42) # no error
Bar(42, named_optional_param={'xyz': 123}) # raises TypeError: object.__init__() takes no parameters

因此,要解决此问题,我只需要更改我在Foo .__ init__方法中执行操作的顺序即可;例如:

class Foo(object):
  def __init__(self, required_param_1, *args, **kwargs):
    self.some_named_optional_param = kwargs.pop('named_optional_param', None)
    # call super only AFTER poping the kwargs
    super(Foo, self).__init__(*args, **kwargs)
    self.required_param = required_param_1
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.