Python中关于面向对象中继承的详细讲解
作者:测试领头羊
面向对象编程 (OOP) 语言的一个主要功能就是“继承”。继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展
1.继承
在程序中,继承描述的是多个类之间的所属关系。
如果一个类A里面的属性和方法可以复用,则可以通过继承的方式,传递到类B里。
那么类A就是基类,也叫做父类;类B就是派生类,也叫做子类。
案例:
# 父类 class A(object): def __init__(self): self.num=50 def print_num(self): print(self.num+100) # 子类 class B(A): pass b=B() print(b.num) b.print_num()
2.单继承
子类只继承一个父类
案例:
# 父类 class A(object): def __init__(self): self.car='20款奔驰' def print_car(self): print('老款%s'%self.car) # 子类 class B(A): pass a=A() print(a.car) a.print_car() b=B() print(b.car) b.print_car()
子类在继承的时候,在定义类时,小括号()中为父类的名字
父类的属性、方法,会被继承给子类
3.多继承
子类继承多个父类
案例1:
# 父类 class A(object): def __init__(self): self.car='20款奔驰' def print_car(self): print('老款%s'%self.car) def lao_car(self): print('20的大奔') class B(object): def __init__(self): self.car='21款背驰' def print_car(self): print('新款%s'%self.car) def xin_car(self): print('21的大奔') # 子类 class C(A,B): pass c=C() print(c.car) c.print_car() c.lao_car() c.xin_car()
案例2:
# 父类 class A(object): def __init__(self): self.car='20款奔驰' def print_car(self): print('老款%s'%self.car) def lao_car(self): print('20的大奔') class B(object): def __init__(self): self.car='21款背驰' def print_car(self): print('新款%s'%self.car) def xin_car(self): print('21的大奔') # 子类 class C(B,A): pass c=C() print(c.car) # 执行B的属性 c.print_car() # 执行B的方法 print(C.__mro__) # 子类的魔法属性__mro__决定了属性和方法的查找顺序 c.lao_car() # 不重名不受影响 c.xin_car()
多继承可以继承多个父类,也继承了所有父类的属性和方法
注意:如果多个父类中有同名的 属性和方法,则默认使用第一个父类的属性和方法(根据类的魔法属性mro的顺序来查找)
多个父类中,不重名的属性和方法,不会有任何影响。
4.子类重写父类的同名属性和方法
案例:
# 父类 class A(object): def __init__(self): self.car='20款奔驰' def print_car(self): print('老款%s'%self.car) class B(object): def __init__(self): self.car='21款背驰' def print_car(self): print('新款%s'%self.car) # 子类 class C(B,A): def __init__(self): self.car='22款奔驰' def print_car(self): print('最新款%s'%self.car) c=C() print(c.car) # 执行B的属性 c.print_car() # 执行B的方法 print(C.__mro__) # 子类的魔法属性__mro__决定了属性和方法的查找顺序
5.子类调用父类同名属性和方法
案例:
# 父类 class A(object): def __init__(self): self.car='20款奔驰' def print_car(self): print('老款%s'%self.car) class B(object): def __init__(self): self.car='21款背驰' def print_car(self): print('新款%s'%self.car) # 子类 class C(B,A): def __init__(self): self.car='22款奔驰' def print_car(self): print('执行子类的__init__方法前,self.car的属性:%s'%self.car) self.__init__() # 执行本类的__init__方法,属性初始化 print('执行子类的__init__方法前,self.car的属性:%s' % self.car) print('最新款%s'%self.car) def print_lao_car(self): print('执行A的__init__方法前,self.car的属性:%s' % self.car) A.__init__(self) # 执行本类的__init__方法,属性初始化 print('执行A的__init__方法前,self.car的属性:%s' % self.car) A.print_car(self) def print_xin_car(self): print('执行B的__init__方法前,self.car的属性:%s' % self.car) B.__init__(self) # 执行本类的__init__方法,属性初始化 print('执行B的__init__方法前,self.car的属性:%s' % self.car) B.print_car(self) c=C() c.print_car() print('*'*10) c.print_lao_car() print('*'*10) c.print_xin_car() print('*'*10) c.print_car()
6.多层继承
class A(object): def __init__(self): self.car='20款奔驰' def print_car(self): print('老款%s'%self.car) class B(object): def __init__(self): self.car='21款奔驰' def print_car(self): print('新款%s'%self.car) class C(B,A): def __init__(self): self.car='22款奔驰' self.money=40 def print_car(self): self.__init__() print('最新款%s'%self.car) def print_lao_car(self): A.__init__(self) # 执行A类的__init__方法,属性初始化 A.print_car(self) def print_xin_car(self): B.__init__(self) # 执行B类的__init__方法,属性初始化 B.print_car(self) class D(C): # 多层继承 pass d=D() d.print_car() d.print_lao_car() d.print_xin_car()
7.调用父类方法super()
案例:
class Animal(object): def play(self): print('动物就是玩') class Dog(Animal): def play(self): super().play() print('狗改不了吃屎') d=Dog() d.play()
8.案例
class Gupiao(object): def xinqing(self): print('股票买入和卖出') class Gongmu(Gupiao): def lianghua(self): super().xinqing() print('公募机构买入和卖出') class Simu(Gupiao): def lianghua(self): Gupiao.__init__(self) Gupiao.xinqing(self) print('私募机构买入和卖出') def xinqing(self): print('专研自己的输出股票和私募买入和卖出') g=Gongmu() g.lianghua() print('*'*10) s=Simu() s.lianghua() s.xinqing()
到此这篇关于Python中关于面向对象中继承的详细讲解的文章就介绍到这了,更多相关Python 面向对象 继承内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!