组合

  1. 什么是组合?

    ​ 组合指的是一个对象中的属性,该属性的值是指向另外一个类的对象

  2. 为什么要使用组合?

    ​ 组合和继承一样,是用来解决类与类之间代码冗余的问题

  3. 如何使用组合?

  • 需求:假如我们需要给学生添加课程属性,但是又不是所有的老男孩学生一进学校就有课程属性,课程属性是学生来老男孩后选出来的,也就是说课程需要后期学生添加进去的

  • 实现思路:如果我们直接在学生中添加课程属性,那么学生刚被定义就需要添加课程属性,这就不符合我们的

    要求,因此我们可以使用组合能让学生未来添加课程属性

封装

  1. 什么是封装?

    比喻:

    ​ 封:比如把一个袋子封起来

    ​ 装:比如把一堆小猫小狗装到袋子里

    封装指的是把一堆属性(特征与技能)封装到一个对象中

    存数据的目的就是为了取,对象可以“.”的方式获取属性

    你钱包有多少钱(数据的封装)

    你的性取向(数据的封装)

    比喻:对象就好比一个袋子,袋子里面装一堆属性

  2. 为什么要封装?

    封装数据的主要原因是:保护隐私

    封装方法的主要原因是:隔离复杂度(快门就是傻瓜相机为傻瓜们提供的方法,该方法将内部复杂的照相功能都隐藏起来了)

  3. 如何封装?

    特征:变量——》数据属性

    技能:函数——》方法属性

    在类内部,定义一堆属性(特征与技能)

    通过 对象.属性 = 属性值

​ 提示:在编程语言中,对外提示的接口(接口可以理解为一个入口),就是函数,称为接口函数,这与接口的概念还不一样,接口代表一组接口函数的集合体

访问限制机制

  1. 什么是访问限制机制?

    在类内部定义,凡是以__开头的数据属性与方法属性,

    都会被python内部隐藏起来,让外部不能“直接”访问类内部的__开头的属性

    比如:__name='tank',这些都是私有的,原则上是供内部调用的

  2. 访问限制机制的目的?

    一堆隐私的属性与不能被外部轻易访问的属性,可以隐藏起来,不被外部直接调用

    好处:

    ​ 对重要的数据获取的逻辑更加严谨,进而保证了数据的安全

    接口:隐私属性可以通过封装一个接口,在接口内做业务逻辑的处理,再把数据返回给调用者

    注意:在python中,不会强制限制属性的访问,类内部__开头的属性,只是做了一种变形

    若想直接访问,调用变形后的名字即可

    class Foo:
    	__name = 'tank'  #--->_类名__属性名
    

property

  1. 什么是property?

    python内置的装饰器,主要是给类内部的方法使用

  2. 为什么要用property?

    使用它的目的,是将类内部的方法(def方法名())变成了(def 方法)

    在对象调用某个方法时,将对象.方法()变成对象.方法(看起来像一个普通的数据属性)

  3. 如何使用property?

    @property

    注意:不能对被装饰过的方法属性修改

多态与多态性

  • 多态
  1. 什么是多态:

    多态指的是同一种事物的多种形态

    序列数据类型有多种形态:列表,字典,集合,文件

    动物有多种形态:人,狗,猪

  2. 多态的目的:

    多态也称之为多态性,在程序中继承就是多态的表现形式

    多态的目的是为了,让多种不同类型的对象,在使用相同的功能的情况下,调用同一个同一个名字的方法名

    父类:定义一套统一的标准

    子类:遵循父类统一的标准

    多态的最终目的:统一子类编写的规范,为了让使用者更方便调用相同功能的方法

  3. 如何实现:

    -继承

    注意:在python中,不会强制要求子类必须遵循父类的一套标准,所以出现了抽象类

  • 多态性

    注意:多态与多态性是两种概念

    多态是指具有不同功能的函数可以使用相同的函数名,这样就可以用一个函数名调用不同内容的函数。

    在面向对象方法中一般是这样表述多态性:向不同的对象发送同一条消息,不同的对象在接收时会产生的行为(即方法)。也就是说,每个对象可以使用自己的方式去响应共同的消息。所谓消息,就是调用函数,不同的行为就是指不同的实现,即执行不同的函数。

    多态性是一个接口(函数func)的多种实现。如(obj.run)**

    多态性的好处:

    增加了程序的灵活性:以不变应万变,不论对象千变万化,使用者都是同一种形式去调用,如(func(animal))

    增加了程序的可扩展性:通过继承Animal类创建了一个新的类,使用者无需更改自己的代码,还是用func(animal)去调用

多态:同一种事情的多种形态,动物分为人类,猪类(在定义角度)

多态性:一种调用方式,不同的执行效果(多态性)

抽象类

  1. 什么是抽象类

    ​ 抽象类是一个特殊的类,它的特殊之处在于只能被继承,不能被实例化

  2. 为什么要有抽象类

    ​ 如果说类是从一堆对象中抽取相同的内容而来的,那么抽象类是从一堆中抽取相同的内容而来的,内容包括数据属性和函数属性

  3. 如何使用

    import abc

鸭子类型

什么是鸭子类型?

​ 在不知道当前对象是何物的情况下,但是你长得像鸭子,那么你就是鸭子类型

在python中,不推荐使用抽象类强制限制子类的定义,但是推荐类都是遵循鸭子类型

-- 继承:

​ 耦合性太高,程序的可扩展性差

--鸭子类型:

​ 耦合度低,程序的可扩展性强

多态操作

class Pig:
    def eat(self):
        print('猪在吃饭')
        pass

    def drink(self):
        pass

    def speak(self):
        print('哼哼哼~~~')

class Cat:
    def eat(self):
        print('猫在吃饭')
        pass

    def drink(self):
        pass

    def speak(self):
        print('喵喵喵~~~')

class Dog:
    def eat(self):
        print('猫在吃饭')
        pass

    def drink(self):
        pass

    def speak(self):
        print('汪汪汪~~~')

dog = Dog()
cat = Cat()
pig = Pig()

def BARK(animal):
    animal.speak()

BARK(dog)
BARK(cat)
BARK(pig)
运行结果:
汪汪汪~~~
喵喵喵~~
哼哼哼~~~
str1 = '1234'
list1 = [1,2,3]

print(str1.__len__())
print(list1.__len__())


def LEN(d):
    return d.__len__()
print(LEN(str1))
print(LEN(list1))

print(len(str1))
print(len(list1))
运行结果:
4
3
4
3
4
3