**super(子类,self).init(形参1,形参2)**没有多么高级的意思,要把这句代码分开理解,**super(子类,self)这句只是引出父类的意思,.init(形参1,形参2)**这个只是调用父类的构造函数,如果用不到父类构造函数内的东西,完全可以不调用,其它方法也是,需要父类方法,调用即可,格式也是如此。
调用构造函数(专有方法)有两种写法:
1.super(子类,self).init(形参1,形参2)
2.父类.init(形参1,形参2)
调用父类一般方法也有两种方法(这里假设一般方法为speak()):
1.super(子类,self).speak()
2.父类.speak(self)
注意:这里的self需要注意,如果在方法内调用父类一般方法,就写self就行,如果在类外部调用父类一般方法,就需要把self换成实例化的对象。
这里有三种情况
第一种子类,父类都没有构造函数情况,如下所示,直接用super(子类,self)函数,就可以调用父类方法了
class Parent: # 定义父类
def myMethod(self):
print ('调用父类方法')
class Child(Parent): # 定义子类
def myMethod(self):
print ('调用子类方法')
c = Child() # 子类实例
c.myMethod() # 子类调用重写方法
super(Child,c).myMethod() #用子类对象调用父类已被覆盖的方法
第二种是父类有构造函数,子类没有构造函数,子类在实例化时会自动调用父类的构造函数
第三种是父类有构造函数,子类也有构造函数,子类在实例化时就不会调用父类的构造函数
这两种情况详见:https://www.runoob.com/w3cnote/python-extends-init.html
第三种的复杂情况,见如下:
子类的一般方法内使用父类的变量
class fa():
def __init__(self,a,b):
self.name=a
self.local=b
def speak(self):
print('my name is:',self.name,"my location is:",self.local)
class son(fa):
def __init__(self,a,b,d):
fa.__init__(self,a,b)#调用父类的构造方法,否则子类speak()方法的变量会被提示无定义,因为调用的是父类的变量
#super(son,self).__init__(a,b) 与上一句等同
#super(son, self).speak()这一句只要在继承父类的构造函数下的方法内或者其它方法内都行,不能独立于方法
self.action=d
def speak(self):
super(son, self).speak()#调用父类的一般方法
print('my name is:', self.name, "my location is:", self.local,
'my location is:',self.action)
ls=son('jk','bbn','io')
ls.speak()
super(son,ls).speak()#调用父类的一般方法
执行结果:
D:\python\python.exe F:/code/d.py
my name is: jk my location is: bbn
my name is: jk my location is: bbn my location is: io
my name is: jk my location is: bbn
进程已结束,退出代码 0
子类的一般方法内使用自己的变量,不使用父类变量
class fa():
def __init__(self,a,b):
self.name=a
self.local=b
def speak(self):
print('my name is:',self.name,"my location is:",self.local)
class son(fa):
def __init__(self,a,b,d):
self.a=a
self.b=b
# fa.__init__(self,a,b)
# super(son,self).__init__(a,b)
# super(son, self).speak()
self.action=d
def speak(self):
print('my name is:', self.a, "my location is:", self.b,
'my location is:',self.action)
ls=son('jk','bbn','io')
ls.speak()
#super(son,ls).speak()
执行结果:
D:\python\python.exe F:/code/d.py
my name is: jk my location is: bbn
my name is: jk my location is: bbn my location is: io
my name is: jk my location is: bbn
进程已结束,退出代码 0