正确使用super(参数传递)的方法

因此,我遵循Python的超级标准,并去测试他的例子

然而,示例1-3本应显示在处理期望不同参数的\uuuu init\uuuu方法时调用super的正确方法,但它不起作用

这就是我得到的:

~$python示例1-3.py
MRO:['E','C','A','D','B','object']
E arg=10
C arg=10
A.
D arg=10
B
回溯(最近一次呼叫最后一次):
文件“Download/example1-3.py”,第27行,in<模块>
E(arg=10)
文件“Download/example1-3.py”,第24行,在__
超级(E,self).\uuuuu初始(arg,*args,**kwargs)
文件“Download/example1-3.py”,第14行,在__
超级(C,self).\uuuuu初始(arg,*args,**kwargs)
文件“Download/example1-3.py”,第4行,在__
super(A,self)。\uuuuu初始值(*args,**kwargs)
文件“Download/example1-3.py”,第19行,在__
超级(D,self).\uuuuu初始(arg,*args,**kwargs)
文件“Download/example1-3.py”,第9行,在__
super(B,self)。\uuuuuu初始值(*args,**kwargs)
TypeError:object.\uuuu init\uuuu()不接受任何参数

似乎object本身违反了文档中提到的最佳实践之一,即使用super的方法必须接受*args**kwargs

现在,很明显,奈特先生希望他的例子能起作用,那么这是在Python的最新版本中改变的吗?我检查了2.6和2.7,但这两个版本都失败了

那么,解决这个问题的正确方法是什么呢

有时两个类可能有一些共同的参数名。在这种情况下,您不能从**kwargs中弹出键值对,也不能从*args中删除它们。相反,您可以定义一个Base类,它不同于对象,吸收/忽略参数:

类基(对象):
定义初始化(self,*args,**kwargs):通过
A类(基本类):
定义初始化(self,*args,**kwargs):
打印“A”
super(A,self)。\uuuuu初始值(*args,**kwargs)
B类(基本类):
定义初始化(self,*args,**kwargs):
打印“B”
super(B,self)。\uuuuuu初始值(*args,**kwargs)
C(A)类:
定义初始值(self,arg,*args,**kwargs):
打印“C”,“arg=”,arg
超级(C,self).\uuuuu初始(arg,*args,**kwargs)
D(B)类:
定义初始值(self,arg,*args,**kwargs):
打印“D”,“arg=”,arg
超级(D,self).\uuuuu初始(arg,*args,**kwargs)
E类(C、D):
定义初始值(self,arg,*args,**kwargs):
打印“E”,“arg=”,arg
超级(E,self).\uuuuu初始(arg,*args,**kwargs)
打印“MRO:”,[x.\uuuuuu名称\uuuuuuuuuu代表E中的x.\uuuuuuuuuuuuuuuuuuuuuuuuuuuuu]
E(10)

屈服

MRO:['E','C','A','D','B','Base','object']
E arg=10
C arg=10
A.
D arg=10
B

请注意,要使其工作,Base必须是MRO中倒数第二个类

发表评论