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,执行后返回值作为本次引用的结果
posted @ 2021-04-13 20:38  黑影Poco  阅读(67)  评论(0)    收藏  举报