面向对象-继承

 

一.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')
***这两种最后不要一起使用,第一种在多继承时使用最好,因为它能区分哪个父类的构造方法

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


  
posted @ 2018-06-23 15:08  lei-jia-ming  阅读(173)  评论(0编辑  收藏  举报