为什么object.__init__
没有*args, **kwargs
作为参数?就我所见,这会以极其恼人的方式打破一些简单的代码而没有任何好处:
假设我们要确保调用所有父类的所有__init__
。只要每个init都遵循调用super().__init__
的简单约定,这将保证整个层次结构只运行一次(也无需专门指定父级)。当我们传递参数时会出现问题:
class Foo:
def __init__(self, *args, **kwargs):
print("foo-init")
super().__init__(*args, **kwargs) # error if there are arguments!
class Bar:
def __init__(self, *args, **kwargs):
print("bar-init")
super().__init__(*args, **kwargs)
class Baz(Bar, Foo):
def __init__(self, *args, **kwargs):
print("baz-init")
super().__init__(*args, **kwargs)
b1 = Baz() # works
b2 = Baz("error")
这是什么原因以及什么是最好的将军(在我的具体情况下可以轻松解决,但又依赖于层次结构的其他知识)解决方法?我能看到的最好的方法是检查父对象是否是对象,在这种情况下不要给它任何args ..可怕的丑陋。
答案 0 :(得分:4)
您可以查看http://bugs.python.org/issue1683368进行讨论。请注意,有人要求导致错误。另请参阅the discussion on python-dev。
无论如何,你的设计很奇怪。为什么要编写每一个课程来指定未指定的*args
和**kwargs
?一般来说,让方法接受他们需要的参数会更好。例如,如果某人错误输入关键字名称,接受所有内容的开放式参数可能会导致各种错误。有时它是必要的,但它不应该是默认的做事方式。
答案 1 :(得分:3)
Raymond Hettinger的super() considered super有一些关于如何处理这个问题的信息。它在“实用建议”部分。