【发布时间】:2012-01-23 14:04:35
【问题描述】:
所以我关注Python's Super Considered Harmful,去测试他的例子。
但是,Example 1-3 应该显示在处理需要不同参数的 __init__ 方法时调用 super 的正确方法,但完全不起作用。
这是我得到的:
~ $ python example1-3.py
MRO: ['E', 'C', 'A', 'D', 'B', 'object']
E arg= 10
C arg= 10
A
D arg= 10
B
Traceback (most recent call last):
File "Download/example1-3.py", line 27, in <module>
E(arg=10)
File "Download/example1-3.py", line 24, in __init__
super(E, self).__init__(arg, *args, **kwargs)
File "Download/example1-3.py", line 14, in __init__
super(C, self).__init__(arg, *args, **kwargs)
File "Download/example1-3.py", line 4, in __init__
super(A, self).__init__(*args, **kwargs)
File "Download/example1-3.py", line 19, in __init__
super(D, self).__init__(arg, *args, **kwargs)
File "Download/example1-3.py", line 9, in __init__
super(B, self).__init__(*args, **kwargs)
TypeError: object.__init__() takes no parameters
似乎object 本身违反了文档中提到的最佳实践之一,即使用super 的方法必须接受*args 和**kwargs。
现在,显然 Knight 先生希望他的示例能够工作,那么这是否在最新版本的 Python 中有所改变?我检查了 2.6 和 2.7,但都失败了。
那么处理这个问题的正确方法是什么?
【问题讨论】:
-
我的首选方式是:扁平且简单的继承层次结构。
-
您还应该阅读"Python's super() considered super" 以获得平衡的观点:)
-
@BjörnPollex:谢谢!您的链接提供了问题的答案:您可以编写一个继承自
object的“根类”,并确保正确调用object的__init__。 -
请注意,
__init__onobject会默默地忽略 Python 2.5 上的任何参数。这在 Python 2.6 中发生了变化。 -
@Wilfred:嘿,感谢您回答实际问题!现在我知道为什么这篇文章已经过时了!
标签: python