继承:子类具备所有父类的公有变量和公有方法
如果子类没有定义__init__构造方法,会自动调用父类的。
子类定义__init__了函数,不会自动调用父类的。
好处:站在老爸的肩膀上,增加属性,增加方法,在原有的基础上进行扩展。
如果父类中有私有变量,那么子类的方法是不能读取父类中的私有变量的
Python3中,所有类都默认继承自object,这3种声明类的方式是等价的:
class P:
class P():
class P(object):
子类想使用父类的构造方法、变量,则必须在子类的构造方法中来完成父类实例的构造方法的调用
class Person:
def __init__(self,name):
self.name = name
def set_name(self,name):
self.name = name
def get_name(self):
return self.name
class AsianPerson(Person):
def __init__(self,name,nation):
Person.__init__(self,name)
#等价 super().__init__(name)
self.nation = nation
def get_name(self):#重写了父类中的方法
return "****:"+self.name
ap= AsianPerson("laowang","china")
print(ap.get_name())
子类调用父类的方法有两种方式:
1、Parent.parentMethod(self)
2、self.parentMethod()
第一种是直接用父类的类名.方法名去调用父类的方法,但是需要注意的是,这种调用方法必须将self作为参数传进去并且作为第一个参数,表示指向这个类的实例本身。这种方法多用于方法重写时。
第二种是直接用self去调用父类的方法,为什么可以这样调用呢?因为一旦子类继承了父类,那么子类就拥有父类所有的公有方法和属性,所以此时父类的方法和属性就相当于子类自己了,所以可以直接用self去直接调用实例的方法,而不用再传入self参数了。
子类调用基类的构造函数有两种方法,基本语法如下:
1、super(subclassName,self).init([parameter1[,parameter2…]])
2、superclassName.init(self,[parameter1[,parameter2…]])
#父类名↑
注意:
两次参数列表中的self参数都是必不可少的,如果基类的构造方法中有除了self参数外别的参数,调用时,也必须传入同等数量、同等类型的参数。
当子类不定义自己的构造方法时,默认会自动调用父类的构造方法
Python中super函数只能在构造方法中使用。
class A(object):
name = ''
def __init__(self):
self.name = 'fosterwu'
def getName(self):
return 'A ' + self.name
class C(A):
def __init__(self):
super(C,self).__init__() #调用基类构造方法
if __name__ == '__main__':
c = C()
print(c.getName())
多重继承
Python支持多重继承,也就是一个子类可以有多个父类,定义子类时,括号中写多个父类,并且父类间用逗号隔开。
在多重继承中,子类有那么多的父类,那子类实例化时,构造方法时怎样调用的呢?
这里需要记住几点:
多重继承中,子类在没有定义自己的构造方法时,以第一个父类为中心。
如果子类重新定义了自己的构造方法,就不会调用父类的构造方法。但如果仍想调用父类的构造方法,这个时候调用哪个父类的构造方法,由你自己确定,并且多重继承时,调用具体哪个父类的构造方法时只能使用如下方法:superclassName.init(self,[parameter1[,parameter2…]])
如果父类中有同名的方法时,通过子类的实例对象去调用的该方法也是第一个父类中的方法。同样你可以用我们上边说的"子类调用基类方法"中的方法去调用具体哪个父类中的方法。Parent.parentMethod(self)
需要多个构造函数参数时,都需要做初始化
从父类、爷爷类去查找方法,叫做深度优先
从多继承的同级类去查找方法,叫做广度优先
多继承的时候,如果都继承了某个类,Py3的方法查找是广度优先,否则是深度优先。
class D:
def bar(self):
print ('D.bar')
class C(D):
def bar1(self):
print ('C.bar')
class B(D):
pass
class A(B, C):
pass
a = A()
a.bar()