Warisan Python: TypeError: object .__ init __ () tidak membutuhkan parameter


91

Saya mendapatkan kesalahan ini:

TypeError: object.__init__() takes no parameters 

ketika menjalankan kode saya, saya tidak benar-benar melihat apa yang saya lakukan salah di sini:

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

Jawaban:


116

Anda memanggil nama kelas yang salah dalam panggilan super () Anda:

class SimpleHelloWorld(IRCReplyModule):

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

Pada dasarnya apa yang Anda selesaikan adalah __init__kelas basis objek yang tidak mengambil parameter.

Ini agak berlebihan, saya tahu, harus menentukan kelas yang sudah Anda masuki, itulah sebabnya di python3 Anda bisa melakukan: super().__init__()


4
@LucasKauffman: Sebenarnya menurutku itu tidak konyol ya. Ini bisa dengan mudah menjadi konsep yang membingungkan. Saya tidak menyalahkan Anda.
jdi

4
Beresiko menyinggung banyak Pythonian: Itu - imho - adalah desain bahasa yang buruk. Terima kasih atas bantuan Anda @jdi!
Johannes Fahrenkrug

4
@JohannesFahrenkrug - Saya rasa Anda tidak akan menyinggung siapa pun, karena itu diidentifikasi sebagai desain yang buruk dan diperbaiki di python3: docs.python.org/3/library/functions.html#super
jdi

3

Ini telah menggigit saya dua kali baru-baru ini (saya tahu saya seharusnya belajar dari kesalahan saya pertama kali) dan jawaban yang diterima juga tidak membantu saya, jadi meskipun masih segar dalam pikiran saya, saya pikir saya akan mengirimkan jawaban saya sendiri untuk berjaga-jaga ada orang lain yang mengalami ini (atau saya perlu ini lagi di masa mendatang).

Dalam kasus saya, masalahnya adalah saya mengirimkan kwarg ke inisialisasi subclass tetapi di superclass kata kunci itu kemudian diteruskan ke panggilan super ().

Saya selalu berpikir hal-hal berikut adalah yang terbaik dengan sebuah contoh:

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

Jadi untuk mengatasi ini saya hanya perlu mengubah urutan saya melakukan sesuatu dengan metode Foo .__ init__; misalnya:

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.