它是一种新建类的方式,继承了一个类,类中的属性和方法就在子类中

  父类就是基类, 子类就是派生类

  拓展: 开发工具IDE: vscode, pycharm, sumlinetext

       开发Java: eclipse, myeclipse, idea

     开发安卓: eclipse+adt,   Androidstudio: 基于idea+adt改的

  新式类: 只要继承了object类,就是新式类,Python3中默认继承object类,python2中,需要显示指定的继承object

  经典类: 没有继承object的类,就是经典类,Python3中没有经典类,Python2中才会有

  1. class A(object):
  2. pass
  3. class B(A):
  4. pass
  5. # 查看类名
  6. print(B.__name__)
  7. 输出: B
  8. # 查看父类
  9. print(B.__bases__) # B的所有的父类
  10. 输出为(<class '__main__.A'>,)

  

  1. class people
  2. school = 'peking university'
  3. class Teacher(people):
  4. def __init__(self, name, age, level)
  5. self.name = name
  6. self.age = age
  7. self.level = level
  8. class Student(people):
  9. def __init__(self, name, age, level)
  10. self.name = name
  11. self.age = age
  12. self.level = level
  13. stu1 = Student('bgon', 85, "python") # 实例化一个对象
  14. print(stu1.school) # 学生类中并没school这个属性,他在父类中定义的
  15. # 输出结果为: peking university

  如果这样继承的话,那么问题就来了,如何重用父类的属性,属性的查找顺序是什么,又是如何重用父类的方法?

  我们之前说过查找对象顺序是: 先找对象===>类中找===>父类中找===>报错,但是呢,今天不一样,在父类中继承了好几个,也就是多继承,那又是如何去寻找?

  1. class people
  2. school = 'peking university'
  3. def __init__(self, name, age, level)
  4. self.name = name
  5. self.age = age
  6. self.level = level
  7. class Teacher(people):
  8. def __init__(self, name, age, level)
  9. self.name = name
  10. self.age = age
  11. self.level = level
  12. class Student(people):
  13. def __init__(self, name, age, couse)
  14. self.name = name
  15. self.age = age
  16. self.couse = couse
  17. stu1 = Student('bgon', 85, "python") # 实例化一个对象
  18. print(stu1.school) # 学生类中并没school这个属性,他在父类中定义的

  上面继承中可以看出,代码出现了冗余,那我们如何重用父类的__init__方法呢,我们先看第一种方法: 指名道姓的使用(跟继承无关)

  1. class people
  2. school = 'peking university'
  3. def __init__(self, name, age, level)
  4. self.name = name
  5. self.age = age
  6. self.level = level
  7. class Teacher(people):
  8. def __init__(self, name, age, level)
  9. self.name = name
  10. self.age = age
  11. self.level = level
  12. class Student(people):
  13. def __init__(self, name, age, couse)
  14. people.__init__(self, age,name)
  15. self.couse = couse

  方式二: 通过super关键字

  1. class people
  2. school = 'peking university'
  3. def __init__(self, name, age, level)
  4. self.name = name
  5. self.age = age
  6. self.level = level
  7. class Teacher(people):
  8. def __init__(self, name, age, level)
  9. self.name = name
  10. self.age = age
  11. self.level = level
  12. class Student(people):
  13. def __init__(self, name, age, couse)
  14. super().__init__(name, age)
  15. self.couse = couse

  super()会按照mro列表拿到父类对象,对象来调用绑定方法, 不需要传递第一个参数(self),所以有__init__(name, age)

  1. class people
  2. school = 'peking university'
  3. def __init__(self, name, age)
  4. self.name = name
  5. self.age = agel
  6. class Teacher(people):
  7. pass
  8. class Student(people):
  9. pass
  10. stu1 = Student('bgon', 85) # 实例化一个对象
  11. print(stu1.school) # 学生类中并没school这个属性,他在父类中定义的

  类实例化会自动调用__init__,如果类中没有,就去父类中去寻找

  1. 多层继承:
  2. class A:
  3. a = "AAAA"
    pass
  4. class B(A):
  5. a = "BBBB"
      pass
  6. class C(B):
  7. a = "CCCC"
    pass
  8. class D(C):
  9. a = "DDDD
       pass
  10. d = D()
  11. print(d, a)
  12. # 输出为DDDD

  

多继承:

  1. class A:
  2. a = "AAAA"
  3. pass
  4. class B:
  5. a = "BBBB"
  6.   pass
  7. class C:
  8. a = "CCCC"
  9. pass
  10. class D(A, B, C):
  11. a = "DDDD
  12.    pass
  13. d = D()
  14. print(d, a)

  那上面的查找顺序又是怎样的呢? 首先还是先从自己找起,当D中没有a的值时,先找A,然后依次是,B,C

继承的菱形问题(显式的都继承一个类,不是object类):

  在新式类和经典类的查找顺序是不一样的, 新式类的查找顺序是广度优先(从左侧开始,,一直往上找,找到菱形的顶点结束(不包括菱形顶点),继续下一个继承的父往上找,找到菱形的顶点结束(不包括菱形顶点)),经典类的查找顺序是深度优先(从左侧开始,,一直往上找,找到菱形的顶点结束(包括菱形顶点))==>一条道找到底然后再去广度上找

  1. class A(object):
  2. def test(self):
  3. print('from A')
  4. class B(A):
  5. def test(self):
  6. print('from B')
  7. class C(A):
  8. def test(self):
  9. print('from C')
  10. class D(B):
  11. def test(self):
  12. print('from D')
  13. class E(C):
  14. def test(self):
  15. print('from E')
  16. class F(D,E):
  17. # def test(self):
  18. # print('from F')
  19. pass
  20. f1=F()
  21. f1.test()
  22. print(F.__mro__) #只有新式才有这个属性可以查看线性列表,经典类没有这个属性 super是严格按照mro列表找
  23. #新式类继承顺序:F->D->B->E->C->A
  24. #经典类继承顺序:F->D->B->A->E->C
  25. #python3中统一都是新式类
  26. #pyhon2中才分新式类与经典类

  

所有的父类都到顶,才叫菱形问题,也就是说有一个总要继承object

 

版权声明:本文为panshao51km-cn原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/panshao51km-cn/p/11617984.html