在程序中,继承描述的是多个类之间的所属关系。
如果一个类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()
子类只继承一个父类
案例:
# 父类 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()
子类在继承的时候,在定义类时,小括号()中为父类的名字
父类的属性、方法,会被继承给子类
子类继承多个父类
案例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的顺序来查找)
多个父类中,不重名的属性和方法,不会有任何影响。
案例:
# 父类 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__决定了属性和方法的查找顺序
案例:
# 父类 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()
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()
案例:
class Animal(object): def play(self): print('动物就是玩') class Dog(Animal): def play(self): super().play() print('狗改不了吃屎') d=Dog() d.play()
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()