目录
1. 组合
1. 什么是组合:
- 组合指的是一个对象中的属性为另一个对象(就是把一个对象1赋值给了另一个对象2的一个属性,对象2就可以通过对象2.属性名.对象2中的属性名 ,来获取对象2 中的属性)
- 继承是类与类之间的关系,而组合是对象与对象之间的关系
2. 组合有什么用
- 组合的目的和继承一样,都是为了减少代码的冗余
3. 如何实现组合
class A:
pass
class B:
pass
a = A()
b = b()
a.obj = b #这样就实现了组合,a对象里的obj属性的属性值是对象b
2. 封装
1. 什么是封装
- 封装指的是把一堆属性放在一个对象中
2. 封装有什么用
- 封装方便了数据的存取,封装后,可以使用
对象名.属性名 的方式获得属性值
3. 如何实现封装
- 在定义类后,实例化类产生一个对象,这个类和他继承的父类的内部的所有属性就会被封装在这个对象中。
3. 访问限制机制
1. 什么是访问限制机制
- 在类的内部,凡是以
__
开头的数据属性与方法属性,都会被python内部隐藏起来,让外部不能直接访问内部的__
开头的属性
2. 访问限制机制有什么用
- 通过使用
__
来定义的属性,可以隐藏起来,不被外部直接调用。 - 好处: 对重要数据获取的逻辑更加严谨,进而保证数据的安全
3. 如何访问以__
开头的属性
-
在类的内部定义一个接口,在接口内做业务逻辑的处理,再把数据返回给调用者
-
在类的外部使用,
_类名__属性名
直接访问这个以__
开头的属性class A: def __init__(self,name) self.__name = name def get_name(self): user_name = input('输入用户名:') if user_name == 'nick': print(self.__name) a = A('123') a.get_name() # 方法一 print(a._A__name) # 方法二
-
通过对属性名的前面加上
__
的方法,还可以实现,程序的按规定步骤运行。class ATM: # 1.插卡 def __insert_card(self): print('插卡') pass # 2.输入密码 def __input_pwd(self): print('密码验证') pass # 3.输入取款金额 def __input_money(self): print('输入金额') pass # 4.开始吐钱 def __get_money(self): print('执行吐钱') pass # 5.打印账单 def __print_flow(self): print('打印账单') pass # 取钱直接接口 def withdraw(self): self.__insert_card() self.__input_pwd() self.__input_money() self.__get_money() self.__print_flow() print('取款程序执行完毕!') atm = ATM() atm.withdraw()
4. property
1. 什么是property
- property是python内置的装饰器,主要是给类内部的方法使用。
2. property 有什么用
- 使用这个装饰器的方法,将类内部的一个
def 方法名()
变成了def方法
在进行调用该方法的时候,不用再方法名后面加上括号。就是让他看上去从动词变成了名词。
3. 如何使用property
class A:
@property
def foo(self):
print('daada')
a = A()
a.foo # daada
5. 多态
1. 什么是多态
- 多态指的是同一种事物的多种形态
2. 多态的作用
- 父类: 定义一套统一的标准.
子类: 遵循父类统一的标准(不是必须遵循,抽象类是必须遵循父类的一套标准) - 统一子类内部的编写的规范, 为了让使用者更方便调用相同功能的方法
3. 如何实现
-
通过继承来实现
-
在python中,不会强制要求子类必须遵循父类的一套标准,所以出现了抽象类
6. 抽象类
1. 什么是抽象类
- abc模块 abstract_class
2. 有什么用
- 强制子类必须遵循父类的一套标准(子类中必须要有父类中被装饰的方法,可以改变这些方法的顺序,但是不能少,少了就会报错,也可有自己的新的方法)
3. 如何使用
-
- 导入 abc 模块
- 父类加上括号,括号内要加上一些东西
- 加上装饰器
-
import abc # 1. 导入 abc 模块 class Animal(metaclass=abc.ABCMeta): # 2. 父类加上括号,括号内要加上一些东西 # 吃 @abc.abstractmethod # 3.加上装饰器 def eat(self): pass # 喝 @abc.abstractmethod def drink(self): pass # 叫 @abc.abstractmethod def speak(self): pass # 猪 class Pig(Animal): # 吃 def eat(self): print('猪在吃饭') pass # 喝 def drink(self): pass def speak(self): print('哼哼哼~~~') # 派生 def run(self): pass pig = Pig() # 只有实例化的时候才会检测抽象类。不符合的报错。没有实例化一定不会报错。
7. 鸭子类型
- 鸭子类型就是不通过继承,一个类自动的遵循某种标准,这样的类就可以叫做鸭子类型。
1.什么是鸭子类型?
在不知道当前对象是何物的情况下,但是你长得像鸭子,那么你就是鸭子类型.
在python中,不推荐使用抽象类强制限制子类的定义,但是推荐类都遵循鸭子类型.
- 继承:
耦合性太高,程序的可扩展性差 - 鸭子类型:
耦合度低,程序的可扩展性强
8. 多态和多态性
- 多态和多态性是两种不同的概念
- 多态性依赖于:继承
- 多态性:定义统一的接口,(类似抽型类中的统一的方法名)
- 多态:同一种事物的多种形态,动物分为人类,猪类(在定义角度) 多态性:一种调用方式,不同的执行效果