为什么`object .__ init__`不带参数


问题内容

为什么不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")

解决方法是什么,什么是最好的一般方法(在我的特定情况下很容易解决,但是依赖于层次结构的其他知识)解决方法?我所能看到的最好的方法是检查父对象是否为对象,在这种情况下不要给它任何参数..太丑陋了。


问题答案:

Raymond
Hettinger的super()认为super具有有关如何处理此问题的一些信息。在“实用建议”部分中。