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

回答:


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
多くのPythonianを怒らせる危険を冒して:それ-imho-はひどい言語設計です。@jdiを助けてくれてありがとう!
Johannes Fahrenkrug 2015

4
@ JohannesFahrenkrug-悪いデザインとして識別され、python3で修正されたため、誰かを怒らせることはないと思います:docs.python.org/3/library/functions.html#super
jdi

3

これは最近2回私を噛みました(私は最初に私の間違いから学ぶべきだったと思います)そして受け入れられた答えはどちらの時間も私を助けませんでした他の誰かがこれに遭遇しています(または私は将来これを再び必要とします)。

私の場合、問題は、サブクラスの初期化に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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.