今日内容
组合:自定义类的对象作为类的属性
继承:父类与子类、多继承
1.组合
将自定义类的对象作为类的属性
class Teacher: def __init__(self, name): self.name = nameclass Student: def __init__(self, name, teacher): self.name = name self.teacher = teachertec = Teacher('zhangsan')stu = Student('lisi', tec)print(stu.teacher.name)
2.继承
2.1 继承
继承:子类与父类形成的一种关系,可以让子类能直接从父类中获取属性与方法优点:减少代码冗余
2.2 语法
class 类名(父类名):pass继承关系: 1.父类的所有未封装的属性和方法,子类都能访问 2.父类的所有封装的属性和方法,子类都不能访问 --外界通过子类或子类对象,都不能访问 --在子类内部也不能访问
2.3 方法的重写
有继承关系下的属性查找顺序: -优先找自身,自身没有找父类 -父类没有找父类的父类 -(python3)一直找到最顶级的父类,如果还没有就报错抽离-派生理解: 先写子类, 抽离 出父类 先写父类, 派生 出子类 先写好父类的方法,由于父类方法的功能不满足子类需求子类还可以重写父类方法:方法名与父类相同,自定义方法的实现体
2.4 重用
还需要父类方法的功能,在父类方法的基础上再添加新功能突破点:在子类中去调用父类的方法,还有保证调用者是子类
2.5 __init__结合super()方法
默认父级的__init__可以被继承过来但是会出现子类对象的属性比父类多例子:def __init__(self, name, salary): super().__init__(name) # 父级有的共性功能通过super()交给父级做,子类特有的自己来完成 self.salary = salary
2.6 简单的多继承
子类可以继承所有父类的所有可继承属性属性查找顺序:优先找自己的,没有则按照继承先后顺序查找父级 类名.mro() # 打印属性查找的顺序
2.7 经典类和新式类
经典类:Python2中才有,没有继承任何类的类 深度优先新式类:Python2中直接或间接继承object的类 Python3中所定义的所有类都是新式类 广度优先