组合
-
什么是组合?
组合指的是一个对象中的属性,该属性的值是指向另外一个类的对象
-
为什么要使用组合?
组合和继承一样,是用来解决类与类之间代码冗余的问题
-
如何使用组合?
-
需求:假如我们需要给学生添加课程属性,但是又不是所有的老男孩学生一进学校就有课程属性,课程属性是学生来老男孩后选出来的,也就是说课程需要后期学生添加进去的
-
实现思路:如果我们直接在学生中添加课程属性,那么学生刚被定义就需要添加课程属性,这就不符合我们的
要求,因此我们可以使用组合能让学生未来添加课程属性
封装
-
什么是封装?
比喻:
封:比如把一个袋子封起来
装:比如把一堆小猫小狗装到袋子里
封装指的是把一堆属性(特征与技能)封装到一个对象中
存数据的目的就是为了取,对象可以“.”的方式获取属性
你钱包有多少钱(数据的封装)
你的性取向(数据的封装)
比喻:对象就好比一个袋子,袋子里面装一堆属性
-
为什么要封装?
封装数据的主要原因是:保护隐私
封装方法的主要原因是:隔离复杂度(快门就是傻瓜相机为傻瓜们提供的方法,该方法将内部复杂的照相功能都隐藏起来了)
-
如何封装?
特征:变量——》数据属性
技能:函数——》方法属性
在类内部,定义一堆属性(特征与技能)
通过 对象.属性 = 属性值
提示:在编程语言中,对外提示的接口(接口可以理解为一个入口),就是函数,称为接口函数,这与接口的概念还不一样,接口代表一组接口函数的集合体
访问限制机制
-
什么是访问限制机制?
在类内部定义,凡是以
__
开头的数据属性与方法属性,都会被python内部隐藏起来,让外部不能“直接”访问类内部的
__
开头的属性比如:
__name='tank'
,这些都是私有的,原则上是供内部调用的 -
访问限制机制的目的?
一堆隐私的属性与不能被外部轻易访问的属性,可以隐藏起来,不被外部直接调用
好处:
对重要的数据获取的逻辑更加严谨,进而保证了数据的安全
接口:隐私属性可以通过封装一个接口,在接口内做业务逻辑的处理,再把数据返回给调用者
注意:在python中,不会强制限制属性的访问,类内部
__
开头的属性,只是做了一种变形若想直接访问,调用变形后的名字即可
class Foo: __name = 'tank' #--->_类名__属性名
property
-
什么是property?
python内置的装饰器,主要是给类内部的方法使用
-
为什么要用property?
使用它的目的,是将类内部的方法(def方法名())变成了(def 方法)
在对象调用某个方法时,将对象.方法()变成对象.方法(看起来像一个普通的数据属性)
-
如何使用property?
@property
注意:不能对被装饰过的方法属性修改
多态与多态性
- 多态
-
什么是多态:
多态指的是同一种事物的多种形态
序列数据类型有多种形态:列表,字典,集合,文件
动物有多种形态:人,狗,猪
-
多态的目的:
多态也称之为多态性,在程序中继承就是多态的表现形式
多态的目的是为了,让多种不同类型的对象,在使用相同的功能的情况下,调用同一个同一个名字的方法名
父类:定义一套统一的标准
子类:遵循父类统一的标准
多态的最终目的:统一子类编写的规范,为了让使用者更方便调用相同功能的方法
-
如何实现:
-继承
注意:在python中,不会强制要求子类必须遵循父类的一套标准,所以出现了抽象类
-
多态性
注意:多态与多态性是两种概念
多态是指具有不同功能的函数可以使用相同的函数名,这样就可以用一个函数名调用不同内容的函数。
在面向对象方法中一般是这样表述多态性:向不同的对象发送同一条消息,不同的对象在接收时会产生的行为(即方法)。也就是说,每个对象可以使用自己的方式去响应共同的消息。所谓消息,就是调用函数,不同的行为就是指不同的实现,即执行不同的函数。
多态性是一个接口(函数func)的多种实现。如(obj.run)**
多态性的好处:
增加了程序的灵活性:以不变应万变,不论对象千变万化,使用者都是同一种形式去调用,如(func(animal))
增加了程序的可扩展性:通过继承Animal类创建了一个新的类,使用者无需更改自己的代码,还是用func(animal)去调用
多态:同一种事情的多种形态,动物分为人类,猪类(在定义角度)
多态性:一种调用方式,不同的执行效果(多态性)
抽象类
-
什么是抽象类
抽象类是一个特殊的类,它的特殊之处在于只能被继承,不能被实例化
-
为什么要有抽象类
如果说类是从一堆对象中抽取相同的内容而来的,那么抽象类就是从一堆类中抽取相同的内容而来的,内容包括数据属性和函数属性
-
如何使用
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