【一】面向对象三大特性
- 面向对象编程有三大特性:
- 封装、继承、多态
- 其中最重要的一个特性就是封装。
- 封装指的就是把数据与功能都整合到一起
【1】什么是封装
- 就是对具体对象的一种抽象
- 简单理解就是把不想让别人看到的对象藏起来
【2】为什么要封装
- 有些敏感数据不想让使用者看到(保护隐私)
【二】隐藏属性
【1】隐藏属性方法
- 在数据属性或函数属性前面加__
- 但是在函数内部可以访问到。
【三】开放接口
- 定义属性就是为了使用,所以隐藏并不是目的
class Hero:
name = '后羿'
work = '射手'
__location = '王者峡谷'
def show_info(self):
print(self.__location)
user = Hero()
user.show_info() # 王者峡谷
- 这里location用__隐藏起来了
- 但是在内部函数
show_info
调用了这个数据属性,且这个函数没有被隐藏 - 这时候这个函数就成了外部调用
location
这个数据属性的接口 - 函数也是一样的道理
class Hero:
name = '后羿'
work = '射手'
__location = '王者峡谷'
def __init_info(self):
print(self.__location)
def show_info(self):
self.__init_info()
user = Hero()
user.show_info() # 王者峡谷
(小结)
- 总结隐藏属性与开放接口,本质就是为了明确地区分内外,类内部可以修改封装内的东西而不影响外部调用者的代码;
- 而类外部只需拿到一个接口,只要接口名、参数不变,则无论设计者如何改变内部实现代码,使用者均无需改变代码。
- 这就提供一个良好的合作基础,只要接口这个基础约定不变,则代码的修改不足为虑。
【四】装饰器property
【1】什么是property
- property是一种特殊的属性,访问它时会执行一段函数,然后返回值。
- 他的主要作用就是用来把绑定给对象的方法,伪装成一个数据属性。
【2】计算圆的面积
- 实例化对象给出半径
class CalculateCircle:
def __init__(self, r):
self.__r = r
@property
def radio(self):
area = 3.14 * (self.__r ** 2)
return f'圆的面积为{area}'
@radio.setter
def radio(self, r):
if r > 100:
raise ValueError('太大啦')
self.__r = r
test1 = CalculateCircle(10)
test1.radio=30
print(test1.radio)
- 对于使用者来说
calculate_area
就很像一个数据属性了
【3】为什么要用property
- 将一个类的函数定义成特性以后,对象再去使用的时候obj.name,根本无法察觉自己的name是执行了一个函数然后计算出来的,这种特性的使用方式遵循了统一访问的原则