为什么`object .__ init__`没有args

时间:2012-06-27 20:42:28

标签: python python-3.x

为什么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 ..可怕的丑陋。

2 个答案:

答案 0 :(得分:4)

您可以查看http://bugs.python.org/issue1683368进行讨论。请注意,有人要求导致错误。另请参阅the discussion on python-dev

无论如何,你的设计很奇怪。为什么要编写每一个课程来指定未指定的*args**kwargs?一般来说,让方法接受他们需要的参数会更好。例如,如果某人错误输入关键字名称,接受所有内容的开放式参数可能会导致各种错误。有时它是必要的,但它不应该是默认的做事方式。

答案 1 :(得分:3)

Raymond Hettinger的super() considered super有一些关于如何处理这个问题的信息。它在“实用建议”部分。