Python 面向对象_继承、组合

今日内容

  • 组合:自定义类的对象作为类的属性
  • 继承:父类与子类、多继承

1.组合

将自定义类的对象作为类的属性
class Teacher:
    def __init__(self, name):
        self.name = name

class Student:
    def __init__(self, name, teacher):
        self.name = name
        self.teacher = teacher

tec = 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中所定义的所有类都是新式类 广度优先
posted @ 2019-04-22 16:22  xt12321  阅读(141)  评论(0编辑  收藏  举报