1> 先说说 属性隐藏
python中用双下划线开头的方式将属性隐藏起来(设置成私有的),其实这仅仅是一种变形操作,所有 __属性都会在
类定义时变成 _类__属性
综上所述,这种属性隐藏的特点如下:
1.类中定义的__x只能在内部使用,如self.__x可以引用到变形之后的属性,外部是引用不了的
2.在子类定义的__x不会覆盖在父类定义的__x,因为子类定义的__x变成了_子类__x,而父类定义的__x变成
了_父类__x,他们本质上是不一样的,也就没有覆盖一说。
3.这种机制也并没有真正的限制外部的访问,比如实例化成对象a,a._A__x,也可以读到数据
4.变形的过程只在类的定义是发生一次,之后不再发生,也类写完后,这时你再 A.__y =2 或者实例化 a.__z =3,
__y 和__z 属性名均不会再变化。
5.跟继承有关系的一个坑,例子如下
所以,在继承中,父类如果不想让子类覆盖自己的方法,可以将方法定义为私有的
2>封装
隐藏数据其实只是封装的一部分,隐藏起来然后对外提供操作该数据的接口,然后可以在接口附加上对该数据操作的限制,以此完成对数据属性操作的严格控制。 ----- 这才是 封装!
所以接下来就是:开放(操作隐藏数据的)接口
封装还一个目的就是 隔离复杂度,即用户只需要知道如何调取我开放的接口,而不用理会该接口下属性的组成及运转
比如,用户进行网上支付,这其中包含很多步骤(选取名下默认信用卡,支付密码,转账给商家,余额扣款,打印账单等等),单对于用户而言,他只需知道如何调取“网上支付”这个函数就行了,不必理会里面是如何实施的,类似这种
其他:在编程语言里,对外提供的接口(接口可理解为了一个入口),可以是函数,称为接口函数,这与接口的概念还不一样,接口代表一组接口函数的集合体。
3>特性(property)
是一种特殊的属性,访问它时会执行一段功能(函数)然后返回值
所以 为什么要用property
将一个类的函数定义成特性以后,对象再去使用的时候obj.func,根本无法察觉自己的func是执行了一个函数
然后计算出来的,这种特性的使用方式遵循了统一访问的原则(数据属性就按数据属性的访问方式,函数属性
就按函数属性的访问方式)
通过property方法实现私有数据的查看和更改,如下,__init__下把name隐藏起来了,obj.view_name就等同于
self.__Name,第二个函数把参数new_name赋给 self.__Name,需注意函数名跟返回值函数名一致,只是装饰器
不同,setter和deleter就是对应的修改和删除方法
4>封装与扩展性
封装在于明确区分内外,使得类实现者可以修改封装内的东西而不影响外部调用者的代码;而外部使用用者只知道一个接口(函数),只要接口(函数)名、参数不变,使用者的代码永远无需改变。如下例子:设计者创建了一个类A,可以计算房间的面积,使用者只需要调取got_area这个接口(或者函数)就可以得到他想要的结果,现在需求改变,使用者想要得到房间的体积,设计者只需要更改接口下的逻辑(这里就是指计算公式),那使用者再调取原来的接口,就得到了体积,所以,设计者只是稍微更改了接口下的逻辑,而使用者根本无需改变任何代码,就用上了新功能。这就是扩展性,只要接口这个基础约定不变,则代码改变不足为虑。