所以我一直在关注Python的超级有害,并去测试他的例子。
但是,示例1-3假定super在处理__init__需要不同参数的方法时显示正确的调用方式,但完全无效。
这是我得到的:
~ $ 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。
现在,很明显,奈特先生希望他的例子行得通,这是否在最新版本的Python中有所改变?我检查了2.6和2.7,但两者均失败。
那么解决这个问题的正确方法是什么?
2
我的首选方式是:平坦而简单的继承层次结构。
—
millimoose 2012年
你也应该阅读“Python的超()超认为是”获得平衡的观点:)
—
比约恩博动
@BjörnPollex:谢谢!您的链接提供了一个问题的答案:你可以写一个“根类”,从继承
—
cha0site 2012年
object,它会确保呼叫object的__init__正确。
请注意,
—
Wilfred Hughes 2014年
__init__on会object静默忽略Python 2.5上的任何参数。这在Python 2.6中已更改。
@Wilfred:嘿,谢谢您回答实际的问题!现在我知道为什么这篇文章过时了!
—
cha0site 2014年