面向对象的基本概念包含对象、类、形象、封装、继承、多态、接口、音讯、组件、复用和模式等。

封装

  拜访权限的管制常被称为是具体实现的暗藏。把数据和办法包装进类中,以及具体实现的暗藏独特被称为封装

publicprotecteddefaultprivate
同类
同包
子类
通用性

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: &quot;Courier New&quot; !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: &quot;Courier New&quot; !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: &quot;Courier New&quot; !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的古老用法

五 封装与扩展性

封装在于明确辨别内外,使得类实现者能够批改封装内的货色而不影响内部调用者的代码;而内部应用用者只晓得一个接口(函数),只有接口(函数)名、参数不变,使用者的代码永远无需扭转。这就提供一个良好的单干根底——或者说,只有接口这个根底约定不变,则代码扭转不足为虑。