目录
一、组合
什么是组合?
组合就是把对象的某个属性设置为另一个对象。
为什么要使用组合?
和继承一样,为了减少代码的冗余。
如何使用组合
class Teacher:
def __init__(self,name,age,sex):
self.name = name
self.age = age
self.sex = sex
class Date:
def __init__(self,year,month,day):
self.year = year
self.month = month
self.day = day
def Tell_biirthday(self):
print(f'''
=== 出身日期 ===
年:{self.year}
月:{self.month}
日:{self.day}
===============
''')
teacher1 = Teacher('tbw',18,'boy')
birthday = Date(1997,8,14)
teacher1.birthday = birthday
teacher1.birthday.Tell_biirthday()
二、封装
什么是封装?
封装指的是把一堆属性(特征和技能)封装到一个对象中。
比喻:对象就好比一个袋子,袋子里装一堆属性。
为什么要封装?
封装的目的为了存取方便存取,可以通过 “对象.属性” 的方式获取属性。
如何封装
再类内部,定义一堆属性(特征与属性)
通过 “对象.属性”的方法取出属性值
特征:变量 ---》 数据属性
技能:函数 ---》 方法属性
三、访问限制机制
什么是访问限制机制?
在类内部定义属性,凡是以__开头的属性与方法属性,都会被python内部自动隐藏起来,让外部不能直接“直接”访问类内部的__开头的属性。
比如:
__name = 'tbw' # 不能直接调用 类名.__name 这个属性,但可以用类内部的接口访问
为什么要有访问限制机制?
限制了一些机密属性被外界直接调用的可能性,使隐私的属性与不能被外部轻易访问的属性,可以隐藏起来,不能被外部直接调用。
(好处)对重要数据的获取的逻辑更加严谨,进而保证了数据的安全。
如何利用访问限制机制?
可以通过类内部的接口调用类内部的隐私数据(因为访问限制是针对外界调用类内部属性的一种措施,它并不禁止类内部的调用),可以在接口内进行一些逻辑判断,再把数据返回给调用者。
注意:在python中不会强制限制属性的访问,类内部__开头的属性
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()
'''
插卡
密码验证
输入金额
执行吐钱
打印账单
取款程序执行完毕!
'''
四、property
什么是property?
property是一种python内置的装饰器,主要是给类内部的按方法使用。
为什么要用property?
使用它的目的,是将类内部的方法“def 方法名+()” 变成了 “def 方法”,
从而使对象调用该方法时,把调用方式 "类名.方法名 + ()" 变成了 “类名.方法名”。
如何使用property?
直接在需要使用property装饰器的方法上面 @property ,和正常装饰器的使用方法一样。
'''
计算人体的bmi: bmi值 = 体重 / (身高 * 身高)
'''
class People:
def __init__(self, name, weight, height):
self.name = name
self.weight = weight
self.height = height
@property
def bmi(self):
return self.weight / (self.height * self.height)
# 了解
@property
def get_name(self):
return self.name
# 改
@get_name.setter
def set_name(self, val):
self.name = val
# 删除
@get_name.deleter
def del_name(self):
del self.name
p = People('jason', 200, 1.6)
# print(p.bmi()) # 打印动词,看起来不合理
# print(p.bmi) # ---> p.bmi()
# 注意: 不能对被装饰过的方法属性修改.
# p.bmi = 18
# 了解: 若真要通过此方法修改属性,可以通过另一种方式修改.
print(p.get_name)
p.set_name = 'tank'
print(p.get_name)
# p.del_name()
# print(p.get_name)
# del p.del_name
# print(p.get_name)
'''
jason
tank
'''
五、多态
什么是多态?
多态指的是同一种事物的多种形态,其实只是为类的定义设定一种规范,方法的形式可以使各种各样的,但他们的方法名必须一样。
多态的目的?
多态也称之为多态性, 在程序中继承就是多态的表现形式。
多态的目的是为了, 让多种不同类型的对象, 在使用相同功能的情况下,调用同一个名字的方法名。
父类: 定义一套统一的标准。
子类: 遵循父类统一的标准。
多态的最终目的: 统一子类编写的规范, 为了让使用者更方便调用相同功能的方法。
如何实现多态?
- 继承就行了
注意:在python中,不会强制要求子类必须遵循父类的一套标准,所以出现了抽象类。
六、抽象类(了解)
什么是抽象类?
abc模块 (adstract_class模块)
使用抽象类的目的?
强制子类必须遵循父类的一套标准。
如何使用抽象类?
import abc
七、鸭子类型(了解)
什么是鸭子类型?
在不知道当前对象是何物的情况下,但是你长得像鸭子,那么你就是鸭子类型.
在python中,不推荐使用抽象类强制限制子类的定义,但是推荐类都遵循鸭子类型.
继承:
耦合性太高,程序的扩展性太差
鸭子类型:
耦合度低,程序的可扩展性强