python面向对象之继承

继承

面向对象的三大特征:
1.封装
2.继承
3.多态

1、什么是继承?

   继承就是一种新建类的方式,
    新建的类我们称为子类或者叫派生类, 
     被继承的类成为父类或者叫基类

子类可以遗传父类的属性
2、为什么用继承?

   类是解决对象与对象之间的代码冗余的

   继承是解决类与类之间的代码冗余的

3、如何用继承

  python支持多继承

  经典类:没有继承object类的子子孙孙类都是经典类
  新式类:继承了object以及该类的子子孙孙类都是新式类

  python2中才区分新式类和经典类
  python3 中都是新式类

4、继承的原理
mro列表

为了实现继承,python会在MRO列表上从左到右开始查找基类,直到找到第一个匹配这个属性的类为止。
  而这个MRO列表的构造是通过一个C3线性化算法来实现的。我们不去深究这个算法的数学原理,
    它实际上就是合并所有父类的MRO列表并遵循如下三条准则:
		1.子类会先于父类被检查
		2.多个父类会根据它们在列表中的顺序被检查
		3.如果对下一个类存在两个合法的选择,选择第一个父类

5、子类如何使用父类的属性

继承的方式有两种:
  方式1:指名道姓, 跟继承没有关系
  方式2:super() 严格依赖继承
  
  指名道姓:再子类的__init__中直接调用父类的类名.函数名(传参),跟继承没有关系
      class People():
          school = 'SH'
      def __init__(self, name, age, gender):
          self.name = name
          self.age = age
          self.gender = gender
      class Student(People):
          # 递归
          def __init__(self, name, age, gender, course=None):
              if course is None:
                  self.courses = []
                  # self => stu1
              People.__init__(self, name, age, gender)

          def choose_course(self, course):
              self.courses.append(course)
              print("%s 选课成功 %s" % (self.name, self.courses))

      class Teacher(People):
          def __init__(self, name, age, gender, level):
              People.__init__(self, name, age, gender)
              self.level = level

          def score(self, stu_obj, num):
              stu_obj.num = num
              print("%s老师给%s打了%s分" % (self.name, stu_obj.name, num))

      stu1 = Student('tom', 19, 'male')
      print(stu1.school)
      print(stu1.name)
      print(stu1.age)

      tea1 = Teacher('lily', 28, 'female', 10)
      print(tea1.school)
      print(tea1.name)
      print(tea1.age)
  super():严格依赖继承。super().__init__(传参)
  		调用super()会得到一个特殊的对象,该对象会参照发起属性查找的那个类的mro
	class People():
		school = 'sh'
		def __init__(self, name, age, course=None):
			self.name = name
			self.age = age

	class Student(People):
		def __init__(self, name, age, course):
			# super(Student, self).__init__(name, age)  # python2
			super().__init__(name, age)  # python3
			self.course = course

	class Teacher(People):
		def __init__(self, name, age, level):

			super().__init__(name, age)  # python3
			self.level = level

	obj = Student('egon',19, 'python')
	print(obj.name)
	print(obj.age)
posted @ 2021-07-13 16:35  zhutianyu  阅读(54)  评论(0)    收藏  举报