21、面向对象之封装
一、封装介绍
面向对象编程有三大特性:封装、继承、多态,其中最重要的一个特性就是封装。封装指的就是把数据与功能都整合到一起,听起来是不是很熟悉,没错,我们之前所说的”整合“二字其实就是封装的通俗说法。除此之外,针对封装到对象或者类中的属性,我们还可以严格控制对它们的访问,分两步实现:隐藏与开放接口
1、隐藏属性
在属性名前使用__就可以实现一个对外隐藏属性效果,此时在外部,无法访问双下滑线开头的属性
class People:
__country = 'CHINA' # 隐藏数据属性
def __init__(self,name,age):
self.__name = name
self.age = age
def __tell(self): # 隐藏函数属性
print('====tell')
obj = People('poco',18)
obj.tell() # 报错,访问不到
但非要访问,也有办法,在类名前加上一条杠,在属性名前加上两条杠就可以访问了.
如下,所以说这种操作并没有严格意义上地限制外部访问,仅仅只是一种语法意义上的变形。
print(obj._People__country)
print(obj._People__name)
2、为什么要隐藏属性
隐藏起来的目标就是为了限制了类外部对数据的直接操作,然后类内应该提供相应的接口来允许类外部间接地操作数据,接口之上可以附加额外的逻辑来对数据的操作进行严格地控制:
class People:
def __init__(self, name):
self.__name = name
def get_name(self):
print('名字:%s' % self.__name)
def set_name(self, v):
if type(v) is not str:
print('小垃圾,必须传字符串类型')
return
self.__name = v
obj = People('poco')
obj.get_name()
obj.set_name(123)
# 运行结果
名字:poco
小垃圾,必须传字符串类型
3、property装饰器
property是一个在类中使用的装饰器,是用来绑定给对象的方法伪造成一个数据属性(把函数伪造成一个数据属性)
案例1:BMI指数
成人的BMI数值:
过轻:低于18.5
正常:18.5-23.9
过重:24-27
肥胖:28-32
非常肥胖, 高于32
体质指数(BMI)=体重(kg)÷身高^2(m)
EX:70kg ÷(1.75×1.75)= 22.86
class People:
def __init__(self, name, height, weight):
self.name = name
self.height = height
self.weight = weight
@property
def bmi(self):
return self.weight / (self.height ** 2)
obj = People('poco', 1.70, 63)
print(obj.bmi) # 伪装成数据属性,就不用加括号调用函数了
# 触发方法bmi的执行,将obj自动传给self,执行后返回值作为本次引用的结果

浙公网安备 33010602011771号