类的继承 一、继承介绍 二、利用继承减少代码冗余,凌形问题

1、什么是继承

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

继承可以想象为子类继承父类的信息,父类又叫基类,子类又名派生类。

学习python3主要是新式类,新式类是指继承了object类就是新式类,python3默认继承object。而经典类只存在于python2中,他在没有继承object时,被称为经典类。

 class A(object):
   pass
 class C:
   pass
 class B(A,C):
   pass
 #类的其他内置属性 __名字__
 print(B.__dict__)
 #类名
 print(B.__name__)
 #B的父类
 print(B.__bases__)
 
 print(C.__bases__)
   

#类的其他内置属性 名字 {'module': 'main', 'doc': None} #类名 B #B的父类 (<class 'main.A'>, <class 'main.C'>) #C的父类 (<class 'object'>,)

二、利用继承减少代码冗余,凌形问题

1、利用继承减少代码冗余

继承是指一个或多个子类从父类中继承同样的一个类型,比如说,一个学校有好多学生,这样这些学生的信息中就有一个共同点就是都在这个学校,这样我们去定义一个对象(学生)时就不需要挨个去给他们再去定义这个学校,而是让学生们去继承这个信息。这样就减少了大量的代码冗余。

2、定义类之后我们的属性查找方法就变为了

先找对象-->再从类中寻找-->再从父类中寻找(多继承)-->找不到报错

 class A:
     a="AAAA"
 class B(A):
     a="BBB"
 
 class C(B):
     # a="CCC"
     pass
 
 # class D(C):
 #     # a = "DDD"
 #     pass
 class D(C):
     # a = "DDD"
     pass
 
 d=D()
 print(d.a)

上边的代码可以让我们直观的查看查找顺序,当找到一个是可以注释掉,就会去寻找下一个。

3、重用父类属性

 class Person:
     school = 'oldboy'
 
 class Teacher(Person):
 
     def __init__(self,name,age,level):
         self.name=name
         self.age=age
         self.level=level
 
 class Student(Person):
     def __init__(self,name,age,course):
         self.name=name
         self.age=age
         self.course=course
 
 
 stu1=Student('wed',19,"Python")
 print(stu1.school)

4、菱形问题

继承的菱形问题(显示的都继承一个类,不是object类):新式类和经典类的查找顺序是不一样的

1)新式类(py3中全是新式类):广度优先---从左侧开始,一直往上找,找到菱形的顶点结束(不包括菱形顶点),继续下一个继承的父类往上找,找到菱形的顶点结束(不包括菱形顶点),最后找到菱形顶点

2)经典类(只有py2中才有):深度优先---从左侧开始,一直往上找,找到菱形的顶点结束(包括菱形顶点)继续下一个继承的父类往上找,找到菱形的顶点结束(不包含菱形定点)

3)不出现菱形问题:正常查找

 

 类的继承
一、继承介绍
二、利用继承减少代码冗余,凌形问题