Python kalıtımı: TypeError: object .__ init __ () parametre almaz


92

Bu hatayı alıyorum:

TypeError: object.__init__() takes no parameters 

kodumu çalıştırırken, burada neyi yanlış yaptığımı gerçekten anlamıyorum:

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

Yanıtlar:


118

Süper () çağrınızda yanlış sınıf adını söylüyorsunuz:

class SimpleHelloWorld(IRCReplyModule):

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

Esasen çözdüğünüz şey __init__, hiçbir parametre almayan nesne temel sınıfıdır.

Zaten içinde bulunduğunuz sınıfı belirtmek zorunda kalmanın biraz gereksiz olduğunu biliyorum, bu yüzden python3'te şunları yapabilirsiniz: super().__init__()


4
@LucasKauffman: Aslında senin aptal olduğunu düşünmüyorum. Kolayca kafa karıştırıcı bir kavram olabilir. Ben seni suçlamıyorum
jdi

4
Pek çok Pythonian'ı gücendirme riski altında: Bu - imho - korkunç bir dil tasarımı. Yardımınız için teşekkürler @jdi!
Johannes Fahrenkrug

4
@JohannesFahrenkrug - Kötü bir tasarım olarak tanımlandığı ve python3'te düzeltildiği için kimseyi rahatsız edeceğinizi sanmıyorum: docs.python.org/3/library/functions.html#super
jdi

3

Bu son zamanlarda beni iki kez ısırdı (ilk seferinde hatamdan ders almam gerektiğini biliyorum) ve kabul edilen cevap bana da yardımcı olmadı, bu yüzden aklımda tazeyken, her ihtimale karşı kendi cevabımı göndereceğimi düşündüm başka biri bununla karşılaşıyor (veya buna gelecekte tekrar ihtiyacım var).

Benim durumumda sorun, alt sınıfın ilklendirilmesine bir kwarg geçiriyor olmamdı, ancak süper sınıfta bu arg anahtar sözcüğü daha sonra super () çağrısına geçiliyordu.

Her zaman bu tür şeylerin bir örnekle en iyisi olduğunu düşünüyorum

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

Bu yüzden bunu çözmek için Foo .__ init__ yönteminde yaptığım şeyleri sırayı değiştirmem gerekiyor; Örneğin:

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.