1

为什么不object.__init__作为*args, **kwargs论据?据我所知,这以一种非常烦人的方式破坏了一些简单的代码,没有任何好处:

假设我们要确保__init__调用所有父类的所有 's。只要每个 init 都遵循调用super().__init__this 的简单约定,就可以保证整个层次结构都运行一次,并且只运行一次(也不必专门指定父级)。当我们传递参数时,问题就出现了:

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")

这样做的原因是什么,最好的通用方法是什么(!在我的特定情况下很容易解决,但这依赖于层次结构的额外知识)解决方法?我能看到的最好的方法是检查父对象是否是对象,在这种情况下不要给它任何参数 .. 太丑了。

4

2 回答 2

4

您可以查看http://bugs.python.org/issue1683368进行讨论。请注意,实际上有人要求它导致错误。另请参阅有关 python-dev 的讨论

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

于 2012-06-27T20:53:05.700 回答
3

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

于 2012-06-27T21:02:57.550 回答