Наследование Python: TypeError: объект.__ init __() не принимает параметров
Я получаю эту ошибку:
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')
Ответы
Ответ 1
Вы вызываете неправильное имя класса в вызове super():
class SimpleHelloWorld(IRCReplyModule):
def __init__(self):
#super(IRCReplyModule,self).__init__('hello world')
super(SimpleHelloWorld,self).__init__('hello world')
По сути, вы решаете, что это __init__
базового класса объекта, который не принимает никаких параметров.
Его немного избыточно, я знаю, нужно указать класс, в котором вы уже находитесь, поэтому в python3 вы можете просто сделать: super().__init__()
Ответ 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