描述
super() 函数是用于调用父类(超类)的一个方法。
super 是用来解决多重继承问题的,直接用类名调用父类方法在使用单继承的时候没问题,但是如果使用多继承,会涉及到查找顺序(MRO)、重复调用(钻石继承)等种种问题。
MRO 就是类的方法解析顺序表, 其实也就是继承父类方法时的顺序表。
语法
以下是 super() 方法的语法:
super(type[, object-or-type])
参数
type – 类。
object-or-type – 类,一般是 self
Python3.x 和 Python2.x 的一个区别是: Python 3 可以使用直接使用 super().xxx 代替 super(Class, self).xxx :
python3.X实例
class A:
def add(self,x):
y=x+1
print(y)
class B(A):
def add(self,x):
super().add(x)
b=B()
b.add(2)
返回值
无
super(FooChild,self)._init_() #首先找到FooChild的父类(就是类FooParent),然后把FooChild的对象转化为类FooParent的对象)
实例
1)对比使用和不使用super()函数的区别
不使用super()函数:
class Parent(object):
def __init__(self):
self.parent = "this is the attribute!"
def fuction(self):
print(self.parent)
print("this is the fuction!")
class Child(Parent):
def __init__(self):
print("Hello world!")
example = Child() #实例化
example.fuction() #调用方法
example.parent #调用属性
#程序运行结果:
Hello world!
Traceback (most recent call last):
File "D:/files/python_study/study_super2.py", line 14, in <module>
example.fuction() #调用方法
File "D:/files/python_study/study_super2.py", line 6, in fuction
print(self.parent)
AttributeError: 'Child' object has no attribute 'parent'
我们发现程序报错,无法正常调用父类属性
使用super()函数:
class Parent(object):
def __init__(self):
self.parent = "this is the attribute!"
def fuction(self):
print(self.parent)
print("this is the fuction!")
class Child(Parent):
def __init__(self):
super(Child,self).__init__()
print("Hello world!")
example = Child() #实例化
example.fuction() #调用方法
example.parent #调用属性
#程序运行结果:
Hello world!
this is the attribute!
this is the fuction!
程序运行正常,可以调用父类属性!
2)使用super()的综合实例
class FooParent(object):
def __init__(self):
self.parent = 'I\'m the parent.'
print("Parent")
def bar(self, message):
print("%s from Parent" % message)
class FooChild(FooParent):
def __init__(self):
super(FooChild, self).__init__()
print("Child")
print(self.parent)
def bar(self, message):
super(FooChild,self).bar(message)
print("Child bar fuction")
#程序运行结果:
Parent
Child
I'm the parent.
HelloWorld! from Parent
Child bar fuction
以上内容,如有错误,敬请批评指正!