回顾
继承
新建类的方式
继承的目的
减少代码冗余
寻找继承的关系
先抽象再继承
什么是抽象
抽取类相似的部分
在继承背景下对象属性的查找顺序
对象》子类》父类
派生
子类继承父类的属性,并且派生出自己新的属性
子类派生出新的属性,并重用父类属性
若子类新的属性与父类的属性相同,则以子类的为准
重用父类的两种方式:
- 直接通过父类.
__init__
,将其当做普通的函数使用 - super().
__init__
指的是的父类的__init__
新式类和经典类
继承了object类都称之为新式类
在python2中没有继承object的类称之为经典类
钻石继承
新式类:
广度优先
经典类:
深度优先
今日内容
组合
什么是组合
组合指的是一个对象中的属性,是另一个对象。
为什么要使用组合
为了减少代码冗余
如何使用组合
class People:
def __init__(self, name, age, sex):
self.name = name
self.age = age
self.sex = sex
class Teacher(People):
def __init__(self, name, age, sex):
super().__init__(name, age, sex)
class Student(People):
def __init__(self, name, age, sex):
super().__init__(name, age, sex)
# 日期类
class Date:
def __init__(self, year, month, day):
self.year = year
self.month = month
self.day = day
def tell_birth(self):
print(f'''
=== 出生年月日 ===
年: {self.year}
月: {self.month}
日: {self.day}
''')
tea1 = Teacher('tank', 17, 'male')
date_obj = Date(2002, 1, 1)
# date_obj.tell_birth()
# 将date对象赋值到tea1对象的date属性中
tea1.date = date_obj
tea1.date.tell_birth()
总结:
继承是类与类的关系,一种什么是什么的关系,子类与父类是从属关系
组合是对象与对象的关系,一种什么有什么的关系,一个对象拥有另一个对象。
封装
什么是封装
把一堆属性封装到一个对象中,对象可以通过“.”的方式获取属性
为什么要封装
方便存取
如何封装
在类内部,定义一堆属性
通过 对象.属性=属性值
访问限制机制
什么是访问限制机制
在类内部定义,凡是以__
开头的数据类型与方法属性,都会被python内部隐藏起来,让外部不能“直接“访问类内部的以__
开头的属性
目的
对重要数据获取的逻辑更加严谨,进而保证了数据的安全
接口
隐私属性可以通过封装一个接口,在接口内做业务逻辑的处理,再把数据返回给调用者
注意:在python中,不会强制限制属性的访问,类内部__
开头的属性,只是做了一种变形,弱项直接访问,调用变形后的名字即可
property
什么是property
python内置的装饰器,主要是给类内部的方法使用
为什么要用property
讲类内部的方法(def方法名())变成了(def方法)
在对象调用某个方法是,将对象.方法()变成对象.方法
如何使用
@property
多态
什么是多态
多态指的是同一种事物的多种形态
多态的目的
统一子类编写的规范, 为了让使用者更方便调用相同功能的方法
抽象类
什么是抽象类
abc模块 abstract_class
使用抽象类的目的
强制子类必须遵循父类的一套标准
鸭子类型
在不知道当前对象是何物的情况下,但是你长得像鸭子,那么你就是鸭子类型.
在python中,不推荐使用抽象类强制限制子类的定义,但是推荐类都遵循鸭子类型.
- 继承:
耦合性太高,程序的可扩展性差 - 鸭子类型:
耦合度低,程序的可扩展性强