面向对象-继承
一.1:面向对象的三大特性--继承
#继承:面向对象中的继承和现实世界的继承相同,即:子可以继承父的内容,它能够提高代码的重用性
例子:
#猫
class cat:
def voice(self):
print('喵~~~~')
def eat(self):
print('吃')
def drink(self):
print('喝')
def pull(self):
print('拉')
#狗
class dog:
def voice(self):
print('汪~~~~')
def eat(self):
print('吃')
def drink(self):
print('喝')
def pull(self):
print('拉')
由此看出,猫和狗都具备了相同的 吃、喝、拉的功能,只有叫声不同,那么可以利用继承的思想,将这些相同的功能进行提炼出来:
#动物
class Animals:
def eat(self):
print('吃')
def drink(self):
print('喝')
def pull(self):
print('拉')
#猫
class cat(Animals):
def voice(self):
print('喵~~~~~')
class dog(Animals):
def voice(self):
print('汪~~~~')
cat = cat()
cat.eat() >>> 吃
cat.drink() >>> 喝
cat.pull() >>> 拉
由此可见,父类将相同的方法进行整合,子类仅需继承父类就可以获得这些方法而不必一一去实现每个方法
一.2: 多继承:
#继Python可以继承多个类
#Python的类如果继承了多个类,那么寻找方法的方式有两种:深度优先和广度优先
注意:py2区分深度优先和广度优先的方式寻找,但py3一律是广度优先,因为py3没有经典类了,py3默认继承 object类
#当类是经典类时,多继承,优先按照深度优先方式查找
#当类是新式类时,多继承,优先按照广度优先方式查找
#经典类(py3没有经典类,只有新式类)
class D:
def bar(self):
print ('D.bar')
class C(D):
def bar(self):
print ('C.bar')
class B(D):
def bar(self):
print ('B.bar')
class A(B, C):
def bar(self):
print ('A.bar')
a = A()
a.bar()
#执行bar方法时,查找顺序为:
1.先在A类找,如果A类没有,就去B类找,如果B类没有,就去D类找,D类没有,去C类找。找不到则报错
2.查找顺序:A->B->D->C
#新式类
class D:
def bar(self):
print ('D.bar')
class C(D):
def bar(self):
print ('C.bar')
class B(D):
def bar(self):
print ('B.bar')
class A(B, C):
def bar(self):
print ('A.bar')
a = A()
a.bar()
#执行bar方法时,查找顺序为:
1.先在A类找,如果A类没有,就去B类找,如果B类没有,就去C类找,C类没有,去D类找。找不到则报错
2.查找顺序:A->B->C->D
小结:
1.只有在python2中才分新式类和经典类,python3中统一都是新式类 2.在python2中,没有显式的继承object类的类,以及该类的子类,都是经典类 3.在python2中,显式地声明继承object的类,以及该类的子类,都是新式类 4.在python3中,无论是否继承object,都默认继承object,即python3中所有类均为新式类
一.3:子类调用父类的构造方法
第一种: 父类名.父类方法
class A:
def __init__(self,name):
self.name = name
class B(A):
def __init__(self,name):
A.__init__(self,name)
self.name = name
b = B('tom')
-----------------------------------------分割线------------------------------------------------
第二种:super()
class A:
def __init__(self,name):
self.name = name
class B(A):
def __init__(self,name):
super().__init__(name)
self.name = name
b = B('tom')
***这两种最后不要一起使用,第一种在多继承时使用最好,因为它能区分哪个父类的构造方法