一、什么是继承
- 继承是一种新建类的方式,新建的类称为子类,被继承的类称为父类
- 继承的特性是:子类会遗传父类的属性
- 继承是类与类之间的关系
二、为什么用继承
- 使用继承可以减少代码的冗余
三、如何显示的声明继承
class 类名(父类1,父类2):
pass
- Python中支持一个类同时继承多个父类
class Parent1:
pass
class Parent2:
pass
class Sub1(Parent1, Parent2):
pass
- 使用__bases__方法可以获取当前类直接继承的父类
print(Sub1.__bases__)
(<class '__main__.Parent1'>, <class '__main__.Parent2'>)
- 在Python3中如果一个类没有继承任何类,则默认继承object类
- 在Python2中如果一个类没有继承任何类,不会继承object类
print(Parent1.__bases__)
(<class 'object'>,)
四、类的分类
- 后面会详细解释类的分类,目前仅做了解
4.1 新式类
- 继承了object的类以及该类的子类,都是新式类
- Python3中所有的类都是新式类
4.2 经典类
- 没有继承object的类以及该类的子类,都是经典类
- 只有Python2中才有经典类
五、继承的应用
class Person:
school = 'xxx'
class Teacher(Person):
def __init__(self,name,age,level):
self.name=name
self.age=age
self.level=level
class Student(Person):
# school = 'yyyy'
def __init__(self,name,age,course):
self.name=name
self.age=age
self.course=course
stu1=Student('wed',19,"Python")
# stu1.school='xxx'
print(stu1.school)
六、继承中属性查找的顺序
之前说过属性查找的顺序。那么,在继承中,属性查找的顺序是什么呢?
先找 当前对象-> 类中找 -> 父类中找(多继承) -> 报错
首先,类实例化会自动调用__init__方法
如果类中没有,去父类中找
class Person(object):
school = 'xxx'
def __init__(self, name, age):
self.name = name
self.age = age
class Teacher(Person):
pass
class Student(Person):
pass
# 类实例化会自动调用__init__如果类中没有,去父类中找
# stu1=Student() #报错,因为父类中必须传两个参数
stu1 = Student('xucheng', 18)
# stu1.school='yyy'
print(stu1.school)
xxx
6.1 多层继承的查找顺序
和之前的说的查找方式一样。
先找 当前对象-> 类中找 -> 父类中找(多继承) -> 报错
#多层继承
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)
BBB
6.2 多继承的查找顺序
class 类名(父类1,父类2):
pass
查找顺序 当前对象-> 类中找 -> 父类中找(多继承) -> 报错
当前对象和当前类中没有时,就会去找父类。从继承的多个父类中,依次从左到右的去寻找。
#多继承
class A:
# a="AAAA"
pass
class B:
# a="BBB"
pass
class C:
a="CCC"
pass
class D(A,B,C):
# a = "DDD"
pass
d=D()
print(d.a)
CCC