Discuss / Python / 求大神解释 super().__init__(**kw)

求大神解释 super().__init__(**kw)

Topic source

我看了一篇blog:https://blog.csdn.net/xc_zhou/article/details/80810121

上面说单继承时,使用super()继承时不用显式引用基类,我的理解是:super().__init__(**kw)就等同于dict.__init__(**kw),但是修改为后者之后5个test都出错了,报错为:
TypeError: descriptor '__init__' of 'dict' object needs an argument

此外,为什么删除了如下的代码后测试也不出错,那它存在的意义是?

    def __init__(self, **kw):

        super().__init__(**kw)

#将 super().__init__(**kw) 改成 dict.__init__(self,**kw) 就不会出错了 

首先解决你关于类继承方面的疑问。

具体原因:子类重写__init__时候,在初始化的时候,直接调用子类的__init__方法,如果子类没有重写,直接调用父类的。看看下面的例子应该可以搞清楚

class A(object):
	def __init__(self):
		print('A')

class B(A):
	def __init__(self):
		super().__init__() #==> 等价于 super(B, self).__init__(**kw) 具体你可以查一查super的用法
                           #==> 同时也等价于 A.__init__(self) 但是不建议这么用 super函数的实现就是为了避免类名直接调用
		print('B')

class C(A):
	def __init__(self):
		print('C')

class D(A):
	pass
			
print("create B")
B()
print('create C')
C()
print('create D')
D()

第二个问题就是解决你提出的 dict.__init__(**kw) 出错问题,其实我上面也有说明 这里的调用应该是dict.__init__(self,**kw)

这里你主要要搞清楚 function 和 method 的概念,可以看这篇博客。你用类名直接调用的时候(dict.__init__)这个其实是个function,而 dict.__init__这个function的参数是两个(self,**kw)此处的self是形参名。


  • 1

Reply