共计 3144 个字符,预计需要花费 8 分钟才能阅读完成。
面向对象的基本概念包含对象、类、形象、封装、继承、多态、接口、音讯、组件、复用和模式等。
封装
拜访权限的管制常被称为是具体实现的暗藏。把数据和办法包装进类中,以及具体实现的暗藏独特被称为 封装。
public | protected | default | private | |
---|---|---|---|---|
同类 | √ | √ | √ | √ |
同包 | √ | √ | √ | |
子类 | √ | √ | ||
通用性 | √ |
public:能够被所有其余类拜访
protected:本身、子类、及同一个包中类(承受包外的子类拜访)
default:同一包中的类能够拜访,申明时没有加修饰符,认为是 friendly(回绝所有外包拜访)
private:只能被本人拜访和批改
类的 拜访控制符 只有三种:public、private、protected
default 是 无拜访控制符。
封装:将相干的概念组成一个单元模块,并通过一个名称来援用它。面向对象封装是将数据和基于数据的操作封装成一个整体对象,对数据的拜访或批改只能通过对象对外提供的接口进行。
面向对象特点
1、是一种合乎人们思考习惯的思维。
2、将简单的问题简单化。
3、使程序员从动作的执行者变为动作的指挥者。
4、实现指定的需要时:
先去找具备所需性能的对象来用。如果该对象不存在,那么创立一个具备所需性能的对象。这样简化了开发并且进步了复用性。面向对象开发、设计、过程
开发过程:其实就是一直的创建对象、调用对象、指挥对象做事件。
设计过程:其实就是在治理和保护对象与对象之间的关系。
一. 封装不是单纯意义的暗藏
封装的真谛在于明确地区分内外,封装的属性能够间接在外部应用,而不能被内部间接应用,然而定义属性的目标终归是要用,内部要想用类暗藏的属性,须要咱们为其开拓接口,让内部可能间接地用到咱们暗藏起来的属性,那这么做的意义何在???
1:封装数据:将数据暗藏起来这不是目标。暗藏起来而后对外提供操作该数据的接口,而后咱们能够在接口附加上对该数据操作的限度,以此实现对数据属性操作的严格控制。
2:封装办法:目标是隔离复杂度
封装办法举例:
1\. 你的身材没有一处不体现着封装的概念:你的身材把膀胱尿道等等这些尿的性能暗藏了起来,而后为你提供一个尿的接口就能够了(接口就是你的。。。,),你总不能把膀胱挂在身材里面,上厕所的时候就跟他人夸耀:hi,man,你瞅我的膀胱,看看我是怎么尿的。
2\. 电视机自身是一个黑盒子,暗藏了所有细节,然而肯定会对外提供了一堆按钮,这些按钮也正是接口的概念,所以说,封装并不是单纯意义的暗藏!!!
3. 快门就是傻瓜相机为傻瓜们提供的办法,该办法将外部简单的照相性能都暗藏起来了
提醒:在编程语言里,对外提供的接口(接口可了解为了一个入口),能够是函数,称为接口函数,这与接口的概念还不一样,接口代表一组接口函数的集合体。
3: 理解
python 并不会真的阻止你拜访公有的属性,模块也遵循这种约定,如果模块名以单下划线结尾,那么 from module import 时不能被导入, 然而你 from module import _private_module 仍然是能够导入的 *
其实很多时候你去调用一个模块的性能时会遇到单下划线结尾的(socket._socket,sys._home,sys._clear_type_cache), 这些都是公有的,原则上是供外部调用的,作为内部的你,独断独行也是能够用的,只不过显得略微傻逼一点点
python 要想与其余编程语言一样,严格控制属性的拜访权限,只能借助内置办法如__getattr__,详见面向对象进阶
四 个性(property)
什么是个性 property
property 是一种非凡的属性,拜访它时会执行一段性能(函数)而后返回值
例一:BMI 指数(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
例二:圆的周长和面积
<pre style="margin: 0px; padding: 0px; overflow-wrap:
break-word; font-family: "Courier New" !important; font-size: 12px !important;">
#留神:此时的个性 arear 和 perimeter 不能被赋值
c.area=3 #为个性 area 赋值
''' 抛出异样:
AttributeError: can't set attribute'''</pre>
为什么要用 property
将一个类的函数定义成个性当前,对象再去应用的时候 obj.name, 根本无法觉察本人的 name 是执行了一个函数而后计算出来的,这种个性的应用形式 遵循了对立拜访的准则
除此之外,看下
<pre
style="margin: 0px; padding: 0px; overflow-wrap: break-word;
font-family: "Courier New" !important; font-size: 12px !important;">
ps:面向对象的封装有三种形式:
【public】
这种其实就是不封装, 是对外公开的
【protected】
这种封装形式对外不公开, 但对敌人 (friend) 或者子类 (形象的说法是“儿子”, 但我不晓得为什么大家 不说“女儿”, 就像“parent”原本是“父母”的意思, 但中文都是叫“父类”) 公开
【private】
这种封装对谁都不公开 </pre>
python 并没有在语法上把它们三个内建到本人的 class 机制中,在 C ++ 里个别会将所有的所有的数据都设置为公有的,而后提供 set 和 get 办法(接口)去设置和获取,在 python 中通过 property 办法能够实现
<pre style="margin: 0px; padding: 0px; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">
class Foo: def __init__(self,val):
self.__NAME=val
#将所有的数据属性都暗藏起来
@property def name(self): return self.__NAME
#obj.name 拜访的是 self.__NAME(这也是实在值的寄存地位)
@name.setter def name(self,value):
if not isinstance(value,str):
在设定值之前进行类型查看
raise TypeError('%s must be str' %value)
self.__NAME=value
#通过类型查看后, 将值 value 寄存到实在的地位 self.__NAME
@name.deleter def name(self): raise TypeError('Can not delete')
f=Foo('egon') print(f.name)
# f.name=10
#抛出异样 'TypeError: 10 must be str'
del f.name
#抛出异样 'TypeError: Can not delete'</pre>
理解:一种 property 的古老用法
五 封装与扩展性
封装在于明确辨别内外,使得类实现者能够批改封装内的货色而不影响内部调用者的代码;而内部应用用者只晓得一个接口(函数),只有接口(函数)名、参数不变,使用者的代码永远无需扭转。这就提供一个良好的单干根底——或者说,只有接口这个根底约定不变,则代码扭转不足为虑。