day_21 回顾 继承 今日内容 组合 封装 访问限制机制 property 多态 鸭子类型

继承

新建类的方式

继承的目的

减少代码冗余

寻找继承的关系

先抽象再继承

什么是抽象

抽取类相似的部分

在继承背景下对象属性的查找顺序

对象》子类》父类

派生

子类继承父类的属性,并且派生出自己新的属性

子类派生出新的属性,并重用父类属性

若子类新的属性与父类的属性相同,则以子类的为准

重用父类的两种方式:

  1. 直接通过父类.__init__,将其当做普通的函数使用
  2. 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中,不推荐使用抽象类强制限制子类的定义,但是推荐类都遵循鸭子类型.

  • 继承:
    耦合性太高,程序的可扩展性差
  • 鸭子类型:
    耦合度低,程序的可扩展性强