在计算机领域中,对象是人们要进行研究的任何事物,它表示具体的事物,此外也表示抽象的规则、计划或事件。对象是数据和操作数据的方法的结合。
对象的状态(数据):一个对象用数据值来描述它的状态,也称为对象属性。
对象的行为(操作):对象的行为用于改变对象的状态,也称为对象方法。
对象唯一性(句柄):即对象名称,每个对象都有自身唯一的标识,通过这种标识,可找到相应的对象。在对象的整个生命期中,它的标识都不改变。
对象之间的通信:对象之间进行通信的结构叫做消息,当一个消息发送给某个对象时,消息应该包含下面几种信息:
1. 接受消息的对象名(目的对象名)。
2. 接收对象去执行某种操作的信息(调用方法名)。
3. 发送给该对象的参数,参数可以是该对象私有的变量名,或者是所有对象都知道的全局变量名。
4. 发送给该对象的消息名(源消息名)。
类的属性:它是对象的状态的抽象,用数据结构来描述类的属性,也称为成员属性。
类的方法:它是对象的行为的抽象,用操作名和实现该操作的方法来描述,也称为成员方法。
类的结构:在客观世界中有若干类,这些类之间有一定的结构关系。通常有下面两种主要的结构关系:
1. 一般/具体结构称为分类结构,也可以说是is a关系。用来描述在继承中子类与父类的关系,即一个派生子类的实例化对象是其父类的一个”例子”。所以有”is a”的关系。
2. 整体/部分结构称为组装结构,它们之间的关系是has a关系。”组合”是实现继承的方式之一,在”组合”继承中,一个子类可以有多个父类,即一个子类”has a”一个父类。
面向对象(object oriented,oo),面向对象是一种对现实世界理解和抽象的方法,是计算机编程技术发展到一定阶段后的产物。在python中一切皆对象,通过面向对象的思维,将现实世界的事物都抽象成为对象,将现实世界中的关系抽象成类、继承,帮助人们实现对现实世界的抽象与数字建模。通过面向对象的方法,更利于用人理解的方式对复杂系统进行分析、设计与编程。而且,面向对象能有效提高编程的效率,通过封装技术,消息机制可以像搭积木的一样快速开发出一个全新的系统。其中对象是类的集合,面向对象思维将对象作为程序的基本单元,将程序和数据封装其中,以提高软件的重用性、灵活性和可扩展性。
面向对象编程踏上了进化的阶梯,增强了结构化编程,实现了数据与动作的融合:数据层和逻辑层现在由一个可用以创建这些对象的简单抽象层来描述。
oo后来又扩展为ooa/ood/oop:
ooa(object oriented analysis)面向对象分析:即根据抽象关键的问题域来分解系统。
ood(object oriented design)面向对象设计:是一种提供符号设计系统的面向对象的实现过程,它用非常接近实际领域术语的方法把系统构造成“现实世界”的对象。
oop(object oriented programming)面向对象编程:是一种程序设计范型,同时也是一种程序开发的方法,实现oop的程序希望能够在程序中包含各种独立而又互相调用的对象,每一个对象又都应该能够接受数据、处理数据并将数据传达给其它对象,因此每个对象都可以被看作一个小型的”机器”,而整个程序系统就是由这些小机器相互协助、组合构建起来的。
封装描述了对数据/信息进行隐藏的观念,它对数据属性提供接口(接口函数)和访问方法。在类的设计时,为数据提供了相应的接口,以免客户程序通过不规范的操作来存取封装的数据属性。
封装的目的:就是把客观事物抽象并封装成类,封装好的每一个类都是独立的,而由类实例化创建的对象亦是如此。对象之间只能通过 消息 这种通信结构来实现通讯。这样做能够实现:类自己的数据和方法只让可信的类或者对象操作,对不可信操作的进行信息隐藏。为类和对象中的方法、属性提供了安全的保障。
封装的作用:一个类就是一个封装了数据以及操作这些数据的方法的逻辑实体。在一个对象内部,某些方法或属性可以是私有的(实例化对象将类中定义的私有属性和方法个性化),它们不能被外界访问。通过封装,为对象内部的数据提供了不同级别的保护,以防止程序中无关的部分意外的改变或错误的使用了对象的私有部分。即隐藏类的功能实现的细节,使代码模块化(松耦合、高内聚)。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
output:
上面的例子是一个简单的封装,在class中定义了各种不同类型的方法和属性,他们都有着属于自己的命名空间和访问限制。
公有属性:类内外都可以被访问
私有属性:只能被类内函数调用,以’__’开头。
内置属性:系统在定义类时默认添加,命名格式为’__x__’
继承令不同类之间拥有了一定的结构与关系。
类之间的关系:
1. 通过继承创建的新类称为”子类”或”派生类”
2. 被继承的类称为”基类”、”父类”或”超类”
通过继承得来的子类能够保留父类中所有需要的数据和行为,同时允许修改或者其他自定义的操作,这些都不会影响到父类。换句话说,继承的新类(子类),能够使用被继承类(父类)的所有功能,并且继承后的子类能够在无需重写这些属性和方法的情况下对父类的功能进行扩展。所以说,继承就是从一般(父类)到特殊(子类)的过程。所以继承最明显的好处在于代码的复用。
泛化表示所有的子类与其父类及祖先类有着一样的特点。
特化描述所有的子类的自定义,也就是,什么属性让它与其父类一同。
要实现继承,可以通过”继承”(inheritance)和”组合”(composition)来实现。其中”继承”又有实现继承和可视继承,”组合”又有接口继承和纯虚类。
实现继承:子类的属性和方法完全继承于父类。
可视继承:子类继承父类的外观和方法。
接口继承:子类的属性明和方法名继承于父类,但是具体的属性值和方法实现由子类重写。
output:
上面例子中由类robotcat()实例化的对象robot,具有由两个父类组合而成的属性和方法。
注意:在实现多重继承时,如果继承的多个父类中均有名称相同的方法时,要注意继承的顺序。
多态的概念指出了不同的对象如何通过他们共同的属性和动作来操作以及访问,而不需考虑他们具体的类,多态表明了动态绑定(运行时)的存在,允许重载及运行时类型确定和验证。
多态就是指不同的类实例(对象)都拥有相同方法和属性,而这些相同的方法和属性在不同情形有着不同的表现形式。多态机制使不同的对象可以共享相同的外部接口(属性名、方法名)。这意味着,虽然针对不同对象的具体操作(方法实现)不同,但通过一个公共的类,它们可以通过相同的方式(属性名、变量名)予以调用。即在不同的对象中可以定义同名属性或方法,但是属性值或方法实现却是各不相同的。
多态的作用:实现了接口重用,保证了在类发生继承或派生时,我们仍然能够正确的调用这些相关类的实例化对象的属性和方法。
从结果中可以看出,我们在调用了不同的对象的相同的方法时,这个方法有着不一样的表现形式。
再举一个栗子:duck typing
在了解了oop的基本知识后,就继续通过代码实现来加深理解吧。 : -)
转载:http://blog.csdn.net/jmilk/article/details/50700583