Python面向对象特性——继承

  

面向对象有3大特性:继承,多态,封装,本章介绍Python中的<强>继承强特性~

  

什么是继承

  

继承是创建类的一种方式,在Python中支持多继承,即在创建类的时候可以继承一个或者多个父类。
在继承关系中,被继承的类通常称为父类(或超类,基类),新建的类则称为子类(或派生类)。

继承的优势在于可以<强>有效地重用代码,提高代码的可读性~

继承示例:

  
 <代码>类Fu_1: #父类
  通过
  
  类Fu_2: #父类
  通过
  
  类Zi_1 (Fu_1): #单继承
  通过
  
  类Zi_2 (Fu_1 Fu_2): #多继承
  通过 
  


上述示例中,Fu_1和Fu_2没有继承任何类,在Python3中,这样就会默认继承对象类,而在Python2中,默认不会继承对象类,注意区分~

可通过类的内置属性__bases__查看这个类继承的所有父类

  
 <代码>打印(Zi_1.__bases__)
  打印(Zi_2.__bases__)
  
  #输出结果:
  (& lt;类__main__.Fu_1的祝辞,)
  (& lt;类__main__.Fu_1的祝辞,& lt;类__main__.Fu_2的祝辞) 
  

重用与派生

  

重用

  

在开发过程中,若新建的一个类和已创建的另一个类属性及方法大致相同,则可以让新建的类(子类)继承已创建的类(父类),这样子类会继承父类的所有属性,包括数据属性和函数属性,实现了代码重用,代码变得简洁,可以有效缩短开发周期~

  
 <代码>类父亲:
  def __init__(自我、名字、年龄):
  self.name=名字
  自我。年龄=年龄
  
  def(自我)说:
  打印(喂!)
  
  类的儿子(父亲):
  通过
  
  p=儿子(“婴儿”,19)
  p.say ()
  
  #输出结果:
  你好!  
  

  

派生

  

在继承过程中,子类也可以添加或者重新定义这些属性,当父类和子类中有同名的属性时(包括数据属性和函数属性),会先调用子类中的属性(操作的是子类的实例化对象)

  
 <代码>类父亲:
  城市=白ⅰ?
  def __init__(自我、名字、年龄):
  self.name=名字
  自我。年龄=年龄
  
  def(自我)说:
  打印('你好!' + self.city)
  
  类的儿子(父亲):
  城市=昂兆取?
  def(自我)说:
  打印(“你好~”+ self.city)
  
  def吃(自我):
  通过
  
  p=儿子(“婴儿”,19)
  p.say ()
  
  #输出结果:
  你好~赫兹 
  

超级

  

在子类的函数中,若是要重用父类中某个函数的功能,可以直接通过超级来调用父类中的函数,当然也可以通过类名.func()来调用,只不过这样与调用普通函数无异。这个经常使用在需要对父类的同名方法进行扩展的场景~

  
 <代码>类父亲:
  def(自我)说:
  打印(喂!)
  
  def(自我介绍):
  打印(父亲)
  
  类的儿子(父亲):
  def(自我)说:
  super()请问()
  # Father.say(自我)#通过类名.func()、输出结果一致
  打印(“你好~”)
  
  p=(儿子)
  p.say ()
  
  #输出结果
  你好!
  你好~  
  

上述示例中,使用超级的时候省略了2个参数:儿子(当前类名称,注意不是父类),自我(当前对象)

  
 <代码> super()请问()
  #等同于
  超级(儿子,自我)请问() 
  

由于超级方法中已经默认传递了自我参数,所以后面的函数不需要再次传递自我~

注意:超级关键字只在新式类中有,Python3中所有的类都是新式类…

在子类的函数中使用超级方法,不一定仅调用同名的父类函数,也可以调用其他的父类函数~

  
 <代码> def(自我)说:
  super () .introduce ()
  打印(“你好~”) 
  


如下示例中子类对父类的初始化方法进行了扩展,这是一种较为常用的使用方式~

  
 <代码>类父亲:
  def __init__(自我、名字、年龄):
  self.name=名字
  自我。年龄=年龄
  def(自我)说:
  打印(喂!)
  
  类的儿子(父亲):
  def __init__(自我、姓名、年龄、爱好):
  超级()。__init__(姓名、年龄)
  自我。爱好=爱好
  
  def(自我)说:
  super()请问()
  打印(“你好~”) 
  


超级方法不光可以在类的内部使用,也可以在类的外部的使用,<强>在类的外部使用时,超级方法不可以省略参数

  
 <代码> #外部使用超级
  p=(儿子)
  超级(儿子,p)请问()
  
  #输出结果:
  你好! 

Python面向对象特性——继承