day24
一、继承介绍
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)不出现菱形问题:正常查找