面向对象4--封装与特性

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这个接口(或者函数)就可以得到他想要的结果,现在需求改变,使用者想要得到房间的体积,设计者只需要更改接口下的逻辑(这里就是指计算公式),那使用者再调取原来的接口,就得到了体积,所以,设计者只是稍微更改了接口下的逻辑,而使用者根本无需改变任何代码,就用上了新功能。这就是扩展性,只要接口这个基础约定不变,则代码改变不足为虑。

    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值