Python中面向对象的讲解(2)

x33g5p2x  于2021-10-07 转载在 Python  
字(3.5k)|赞(0)|评价(0)|浏览(359)

1.继承

在程序中,继承描述的是多个类之间的所属关系。

如果一个类A里面的属性和方法可以复用,则可以通过继承的方式,传递到类B里。
那么类A就是基类,也叫做父类;类B就是派生类,也叫做子类。

案例:

  1. # 父类
  2. class A(object):
  3. def __init__(self):
  4. self.num=50
  5. def print_num(self):
  6. print(self.num+100)
  7. # 子类
  8. class B(A):
  9. pass
  10. b=B()
  11. print(b.num)
  12. b.print_num()

2.单继承

子类只继承一个父类

案例:

  1. # 父类
  2. class A(object):
  3. def __init__(self):
  4. self.car='20款奔驰'
  5. def print_car(self):
  6. print('老款%s'%self.car)
  7. # 子类
  8. class B(A):
  9. pass
  10. a=A()
  11. print(a.car)
  12. a.print_car()
  13. b=B()
  14. print(b.car)
  15. b.print_car()

子类在继承的时候,在定义类时,小括号()中为父类的名字
父类的属性、方法,会被继承给子类

3.多继承

子类继承多个父类

案例1:

  1. # 父类
  2. class A(object):
  3. def __init__(self):
  4. self.car='20款奔驰'
  5. def print_car(self):
  6. print('老款%s'%self.car)
  7. def lao_car(self):
  8. print('20的大奔')
  9. class B(object):
  10. def __init__(self):
  11. self.car='21款背驰'
  12. def print_car(self):
  13. print('新款%s'%self.car)
  14. def xin_car(self):
  15. print('21的大奔')
  16. # 子类
  17. class C(A,B):
  18. pass
  19. c=C()
  20. print(c.car)
  21. c.print_car()
  22. c.lao_car()
  23. c.xin_car()

案例2:

  1. # 父类
  2. class A(object):
  3. def __init__(self):
  4. self.car='20款奔驰'
  5. def print_car(self):
  6. print('老款%s'%self.car)
  7. def lao_car(self):
  8. print('20的大奔')
  9. class B(object):
  10. def __init__(self):
  11. self.car='21款背驰'
  12. def print_car(self):
  13. print('新款%s'%self.car)
  14. def xin_car(self):
  15. print('21的大奔')
  16. # 子类
  17. class C(B,A):
  18. pass
  19. c=C()
  20. print(c.car) # 执行B的属性
  21. c.print_car() # 执行B的方法
  22. print(C.__mro__) # 子类的魔法属性__mro__决定了属性和方法的查找顺序
  23. c.lao_car() # 不重名不受影响
  24. c.xin_car()

多继承可以继承多个父类,也继承了所有父类的属性和方法
注意:如果多个父类中有同名的 属性和方法,则默认使用第一个父类的属性和方法(根据类的魔法属性mro的顺序来查找)
多个父类中,不重名的属性和方法,不会有任何影响。

4.子类重写父类的同名属性和方法

案例:

  1. # 父类
  2. class A(object):
  3. def __init__(self):
  4. self.car='20款奔驰'
  5. def print_car(self):
  6. print('老款%s'%self.car)
  7. class B(object):
  8. def __init__(self):
  9. self.car='21款背驰'
  10. def print_car(self):
  11. print('新款%s'%self.car)
  12. # 子类
  13. class C(B,A):
  14. def __init__(self):
  15. self.car='22款奔驰'
  16. def print_car(self):
  17. print('最新款%s'%self.car)
  18. c=C()
  19. print(c.car) # 执行B的属性
  20. c.print_car() # 执行B的方法
  21. print(C.__mro__) # 子类的魔法属性__mro__决定了属性和方法的查找顺序

5.子类调用父类同名属性和方法

案例:

  1. # 父类
  2. class A(object):
  3. def __init__(self):
  4. self.car='20款奔驰'
  5. def print_car(self):
  6. print('老款%s'%self.car)
  7. class B(object):
  8. def __init__(self):
  9. self.car='21款背驰'
  10. def print_car(self):
  11. print('新款%s'%self.car)
  12. # 子类
  13. class C(B,A):
  14. def __init__(self):
  15. self.car='22款奔驰'
  16. def print_car(self):
  17. print('执行子类的__init__方法前,self.car的属性:%s'%self.car)
  18. self.__init__() # 执行本类的__init__方法,属性初始化
  19. print('执行子类的__init__方法前,self.car的属性:%s' % self.car)
  20. print('最新款%s'%self.car)
  21. def print_lao_car(self):
  22. print('执行A的__init__方法前,self.car的属性:%s' % self.car)
  23. A.__init__(self) # 执行本类的__init__方法,属性初始化
  24. print('执行A的__init__方法前,self.car的属性:%s' % self.car)
  25. A.print_car(self)
  26. def print_xin_car(self):
  27. print('执行B的__init__方法前,self.car的属性:%s' % self.car)
  28. B.__init__(self) # 执行本类的__init__方法,属性初始化
  29. print('执行B的__init__方法前,self.car的属性:%s' % self.car)
  30. B.print_car(self)
  31. c=C()
  32. c.print_car()
  33. print('*'*10)
  34. c.print_lao_car()
  35. print('*'*10)
  36. c.print_xin_car()
  37. print('*'*10)
  38. c.print_car()

6.多层继承

  1. class A(object):
  2. def __init__(self):
  3. self.car='20款奔驰'
  4. def print_car(self):
  5. print('老款%s'%self.car)
  6. class B(object):
  7. def __init__(self):
  8. self.car='21款奔驰'
  9. def print_car(self):
  10. print('新款%s'%self.car)
  11. class C(B,A):
  12. def __init__(self):
  13. self.car='22款奔驰'
  14. self.money=40
  15. def print_car(self):
  16. self.__init__()
  17. print('最新款%s'%self.car)
  18. def print_lao_car(self):
  19. A.__init__(self) # 执行A类的__init__方法,属性初始化
  20. A.print_car(self)
  21. def print_xin_car(self):
  22. B.__init__(self) # 执行B类的__init__方法,属性初始化
  23. B.print_car(self)
  24. class D(C): # 多层继承
  25. pass
  26. d=D()
  27. d.print_car()
  28. d.print_lao_car()
  29. d.print_xin_car()

7.调用父类方法super()

案例:

  1. class Animal(object):
  2. def play(self):
  3. print('动物就是玩')
  4. class Dog(Animal):
  5. def play(self):
  6. super().play()
  7. print('狗改不了吃屎')
  8. d=Dog()
  9. d.play()

8.案例

  1. class Gupiao(object):
  2. def xinqing(self):
  3. print('股票买入和卖出')
  4. class Gongmu(Gupiao):
  5. def lianghua(self):
  6. super().xinqing()
  7. print('公募机构买入和卖出')
  8. class Simu(Gupiao):
  9. def lianghua(self):
  10. Gupiao.__init__(self)
  11. Gupiao.xinqing(self)
  12. print('私募机构买入和卖出')
  13. def xinqing(self):
  14. print('专研自己的输出股票和私募买入和卖出')
  15. g=Gongmu()
  16. g.lianghua()
  17. print('*'*10)
  18. s=Simu()
  19. s.lianghua()
  20. s.xinqing()

相关文章