面向对象编程

面对对象编程
OOP
编程的发展已经从简单控制流中按步的指令序列进入到更有组织的方式中
结构化的或过程性的编程可以让我们把程序组成逻辑块,以便重复或重用
面向对象编程增强了结构化编程,实现数据与动作的融合
数据层和逻辑层由一个可用以创建这些对象的简单抽象层来描述
常用术语
抽象/实现:抽象是指现实世界问题和实体的本质表现,行为和特征建模,建立一个相关的子集,可以用于描绘程序的结构,从而实现这种模型
封装/接口:封装描述了对数据/信息进行隐藏的观念,他对数据属性提供接口和访问函数;客户端根本不需要知道在封装之后,数据属性是如何组织,这就需要在设计时,对数据提供相应的接口

常用术语续1
合成:合成扩充了对类的描述,使得多个不同的类合成一个大的类,来解决现实问题
派生/继承:派生描述了子类的创建,新类保留已存类类型中所有需要的数据和行为,但允许修改和其他的自定义操作,都不会修改原类的定义
多态:指出了对象如何通过他们共同的属性和动作来操作及访问,而不需要考虑他们的具体的类。

常用术语续2
泛化/特化:泛化表示所有子类与其父类及祖先类有一样的特点;特化描述所有子类的自定义,也就是什么属性让他与其祖先类不同
自省/反射:自省表示给予程序员某种能力来进行像“手工类型检查”的工作,它也被称为反射。这个性质展示了某对象是如何在运行期取得自身信息的



创建类
类是一种数据结构,我们可以用它来定义对象,对象把数据值和行为特性融合在一起
python使用class关键字来创建类
通常类的第一个字母大写


类的数据属性
数据属性仅仅是所定义的类的变量
这种属性已是静态变量,或者是静态数据。它们表示这些数据是与他们所属的类对象绑定的,不依赖与任何类实例
静态成员通常仅用来跟踪与类相关的值
>>> class C(object):
...   foo = 100
...
>>> print C.foo
100
>>> C.foo +=1
>>> print C.foo
101
特殊的类属性



属性                描述
C.__name__          类C的名字(字符串)
C.__doc__           类C的文档字符串
C.__base__          类C的所有父类构成的元素
C.__dict__          类C的属性
C.__module__        类C的定义所在的模块
C.__class__         实例C对应的类

实例
创建实例
如果说类是一种数据结构定义类型,那么实例则声明了一个这种类型的变量
类被实例化得到实例,该实例的类型就是这个被实例化的类
创建实例与调用函数类似,调用一个类就创建了它的一个实例
>>> class C(object):
...   foo = 100
...
>>> c=C()
>>> print c
<__main__.C object at 0x7f8c5143d210>
>>> print c()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'C' object is not callable
>>> >>> class C(object):
  File "<stdin>", line 1
    >>> class C(object):
     ^
SyntaxError: invalid syntax

实例属性
实例仅拥有数据属性,数据属性只是与某个类的实例相关联的数据值,并且可以通过句点属性标识法来访问
设置实例的属性可以在实例创建后任意时间进行,也可以在能够访问实例的代码中进行
>>> class C(object):
...   pass
...
>>> c=C()
>>> c.hi = 'hello'
>>> print c.hi
hello

特殊的实例属性

属性            描述
I.__class__     实例化I的类
I.__dict__      I的属性

>>> c=C()
>>> c.hi = 'hello'
>>> print c.hi
hello
>>> c.__dict__
{'hi': 'hello'}
>>> print c.__class__
<class '__main__.C'>
>>>
类与实例属性对比
类属性仅是与类相关的数据值,类属性和实例无关
静态成员(类的数据属性)不会因为实例而改变他们的值,除非实例中显示改变它
类和实例都是名字空间,各不相同
>>> class C(object):
...   version = 1.0
...
>>> c=C()
>>> C.version +=0.1
>>> print 'in C version=%s, in c version=%s'%(C.version, c.version)
in C version=1.1, in c version=1.1
>>> c.version +=0.1
>>> print 'in C version=%s, in c version=%s' %(C.version, c.version)
in C version=1.1, in c version=1.2
>>>


组合及派生
方法
__init__方法
__init__()是实例创建后一个被调用的方法
设置实例的属性可以在实例创建后任意时间进行,但是通常情况下优先在__init__方法中实现

绑定方法
方法仅仅是类内部定义的函数,方法只有在其所属的类里拥有实例时,才能被调用
任何一个方法定义中的第一个参数都是变量self,它表示调用此方法的实例对象
非绑定方法
调用非绑定方法并不经常用到
需要调用一个没有实例的类中的方法的一个主要场景是你在派生一个子类,而且要覆盖父类的方法

组合
什么是组合
类被定义后,目标就是要把它当成一个模块来使用,并把这些对像嵌入到你的代码中去
组合就是让不同的类混合并加入到其他的类中来增加功能和代码重用性
可以在一个大点的类中创建其他类的实例,实现一些其他属性和方法来增强对原来的类对象
实现组合
创建复合对象、应用组合可以实现附加的功能
例如,通过组合实现上述地址簿功能的增强

子类和派生
创建子类
当类之间有显著的不同,并且较小的类是较大的类所需要的组件时组合表现的很好,但当设计‘相同的类但有些不同的功能时’,派生就是一个更加合理的选择
OOP的强大方面之一是能够使用一个已经定义好的类,扩展它或对其进行修改,而不影响系统中使用显存类的其他代码片段
OOD(面向对象设计)允许类特征在子孙类或子类中进行继承
创建子类续1
创建子类只需要在圆括号中写明从哪个父类继承即可
继承
继承描述了基类的属性如何遗传给派生类
子类可以继承它的基类的任何属性,不管是数据属性还是方法
通过继承覆盖的方法
如果子类中有和父类同名的方法,父类方法将被覆盖
如需要访问父类方法,则要调用一个为绑定的父类方法,明确给出子类的实例
多重继承
python允许多重继承,即一个类可以是多个父类的子类,子类可以拥有所有父类的属性

类和实例的内建函数
函数            功能
rissubclass()   判断一个类是另一个类的子类或孙类
isinstance()    在判定一个对象是否是另一个给定类的实例
hasattr()       判断一个对象是否有一个特定的属性
getattr()       获得一个对象的属性值
setattr()       设置一个对象的属性
delattr()       删除一个对象的属性

私有化

python为类元素(属性,方法)的私有性提供初步的形式,由双下划线开始的属性在运行时被‘混淆’,所以直接访问是不允许的

posted @ 2018-02-08 18:28  Guan_zi  阅读(99)  评论(0编辑  收藏  举报