新闻中心

python封装实例代码分析

这篇“python封装实例代码分析”文章的封装分析知识点大部分人都不太理解,所以小编给大家总结了以下内容,实例内容详细,代码步骤清晰,封装分析具有一定的实例借鉴价值,希望大家阅读完这篇文章能有所收获,代码下面我们一起来看看这篇“python封装实例代码分析”文章吧。封装分析

面向对象编程三大特性:封装、实例继承、代码多态

隐藏属性

封装其实就是封装分析将数据或者功能隐藏起来(包起来 装起来)

隐藏的目的不是让用户无法使用 而是给这些隐藏的数据开设特定的接口 让用户使用接口才可以去使用 我们在接口中添加一些额外的操作

1.在类定义阶段使用双下划线开头的名字 都是隐藏的属性

后续类和对象都无法直接获取

2.在python中不会真正的限制任何代码

隐藏的属性如果真的需要访问 也可以 只不过需要做变形处理

    __变量名    _类名__变量名

ps:既然隐藏了 就不改使用变形之后的名字去访问 这样就失去了隐藏的意义

Python的Class机制采用双下划线开头的方式将属性隐藏起来(设置成私有的),但其实这仅仅只是实例一种变形操作,类中所有双下滑线开头的代码属性都会在类定义阶段、检测语法时自动变成“_类名__属性名”的封装分析形式: 

class Foo:    __N=0 # 变形为_Foo__N        def __init__(self): # 定义函数时,会检测函数语法,实例所以__开头的代码属性也会变形        self.__x=10 # 变形为self._Foo__x            def __f1(self): # 变形为_Foo__f1        print('__f1 run')        def f2(self):  # 定义函数时,会检测函数语法,所以__开头的属性也会变形        self.__f1() #变形为self._Foo__f1() print(Foo.__N) # 报错AttributeError:类Foo没有属性__N obj = Foo()print(obbj.__x) # 报错AttributeError:对象obj没有属性__x

这种变形需要注意的问题是:

1、在类外部无法直接访问双下滑线开头的属性,但知道了类名和属性名就可以拼出名字:_类名__属性,然后就可以访问了,如Foo._A__N,所以说这种操作并没有严格意义上地限制外部访问,仅仅只是一种语法意义上的变形。

>>> Foo.__dict__mappingproxy({ ..., '_Foo__N': 0, ...}) >>> obj.__dict__{ '_Foo__x': 10} >>> Foo._Foo__N0>>> obj._Foo__x10>>> obj._Foo__N0

2、在类内部是可以直接访问双下滑线开头的属性的,比如self.__f1(),因为在类定义阶段类内部双下滑线开头的属性统一发生了变形。

>>> obj.f2()__f1 run

3、变形操作只在类定义阶段发生一次,在类定义之后的赋值操作,不会变形。

>>> Foo.__M=100>>> Foo.__dict__mappingproxy({ ..., '__M': 100,...})>>> Foo.__M100 >>> obj.__y=20>>> obj.__dict__{ '__y': 20, '_Foo__x': 10}>>> obj.__y20

开放接口

定义属性就是为了使用,所以隐藏并不是目的

隐藏数据属性

将数据隐藏起来就限制了类外部对数据的直接操作,然后类内应该提供相应的接口来允许类外部间接地操作数据,接口之上可以附加额外的逻辑来对数据的操作进行严格地控制

class Student(object):    __school = '清华大学'    def __init__(self, name, age):        self.__name = name        self.__age = age    # 专门开设一个访问学生数据的通道(接口)    def check_info(self):        print("""        学生姓名:%s        学生年龄:%s        """ % (self.__name, self.__age))    # 专门开设一个修改学生数据的通道(接口)    def set_info(self,name,age):        if len(name) == 0:            print('用户名不能为空')            return        if not isinstance(age,int):            print('年龄必须是数字')            return        self.__name = name        self.__age = agestu1 = Student('jason', 18)stu1.set_info('','我很大')

隐藏函数属性

目的的是为了隔离复杂度,例如ATM程序的取款功能,该功能有很多其他功能组成,比如插卡、身份认证、输入金额、打印小票、取钱等,而对使用者来说,只需要开发取款这个功能接口即可,其余功能我们都可以隐藏起来

>>> class ATM:...     def __card(self): #插卡...         print('插卡')...     def __auth(self): #身份认证...         print('用户认证')...     def __input(self): #输入金额...         print('输入取款金额')...     def __print_bill(self): #打印小票...         print('打印账单')...     def __take_money(self): #取钱...         print('取款')...     def withdraw(self): #取款功能...         self.__card()...         self.__auth()...         self.__input()...         self.__print_bill()...         self.__take_money()...>>> obj=ATM()>>> obj.withdraw()

总结隐藏属性与开放接口,本质就是为了明确地区分内外,类内部可以修改封装内的东西而不影响外部调用者的代码;而类外部只需拿到一个接口,只要接口名、参数不变,则无论设计者如何改变内部实现代码,使用者均无需改变代码。这就提供一个良好的合作基础,只要接口这个基础约定不变,则代码的修改不足为虑。

property伪装属性

BMI指数是用来衡量一个人的体重与身高对健康影响的一个指标,计算公式为

体质指数(BMI)=体重(kg)÷身高^2(m)EX:70kg÷(1.75×1.75)=22.86

身高或体重是不断变化的,因而每次想查看BMI值都需要通过计算才能得到,但很明显BMI听起来更像是一个特征而非功能,为此Python专门提供了一个装饰器property,可以将类中的函数“伪装成”对象的数据属性,对象在访问该特殊属性时会触发功能的执行,然后将返回值作为本次访问的结果,例如

 class Person:     def __init__(self, name, weight, height):         self.name = name         self.weight = weight        self.height = height     @property     def BMI(self):         return self.weight / (self.height ** 2) p1 = Person('jason', 78, 1.83) res = p1.BMI()

以上就是关于“python封装实例代码分析”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注本站行业资讯频道。

上一篇:老年人慢性胃炎吃什么好 下一篇:天然气汽车喷轨cng喷轨油改气燃气改装配件高速静音共轨头喷气嘴

Copyright © 2023 imtoken钱包安卓版下载 版权所有   网站地图