我收到此错误:
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')
答案 0 :(得分:93)
您在super()调用中调用了错误的类名:
class SimpleHelloWorld(IRCReplyModule):
def __init__(self):
#super(IRCReplyModule,self).__init__('hello world')
super(SimpleHelloWorld,self).__init__('hello world')
基本上你要解决的是对象基类的__init__
,它没有参数。
我知道,它有点多余,必须指定你已经在里面的类,这就是为什么在python3中你可以这样做:super().__init__()
答案 1 :(得分:1)
这最近让我痛苦了两次(我知道我应该是第一次从错误中吸取教训),而且被接受的答案两次都没有帮助过我,所以尽管我脑海中浮现出新的想法,但我还是想自己提交答案以防万一其他人遇到这个问题(或者将来我需要这个)。
在我的情况下,问题是我在子类的初始化中传递了一个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