关于类的基本认识
术语解释,均来自维基百科。
1、问题空间
问题空间是问题解决者对一个问题所达到的全部认识状态,它是由问题解决者利用问题所包含的信息和已贮存的信息主动地构成的。
一个问题一般有下面三个方面来定义:
- 初始状态——一开始时的不完全的信息或令人不满意的状况;
- 目标状态——你希望获得的信息或状态;
- 操作——为了从初始状态迈向目标状态,你可能采取的步骤。
这三个部分加在一起定义了问题空间(problem space)。
2、对象
对象(object),台湾译作物件,是面向对象(Object Oriented)中的术语,既表示客观世界问题空间(Namespace)中的某个具体的事物,又表示软件系统解空间中的基本元素。
对象这个属于,比较抽象。因此,有人认为,将object翻译为“对象”,常常让人迷茫,不如翻译为“物件”更好。因为“物件”让人感到一种具体的东西,而所谓对象,就是指那种具体的东西。
这种看法在某些语言中是非常适合的。但是,在Python中,则无所谓,不管怎样,python中的一切都是对象,不管是字符串、函数、模块还是类,都是对象。“万物皆对象”。
都是对象有什么优势吗?太有了。这说明python天生就是OOP的。也说明,python中的所有东西,都能够进行拼凑组合应用,因为对象就是可以拼凑组合应用的。
对于对象这个东西,OOP大师Grandy Booch的定义,应该是权威的,相关定义的内容包括:
- 对象:一个对象有自己的状态、行为和唯一的标识;所有相同类型的对象所具有的结构和行为在他们共同的类中被定义。
- 状态(state):包括这个对象已有的属性(通常是类里面已经定义好的)在加上对象具有的当前属性值(这些属性往往是动态的)
- 行为(behavior):是指一个对象如何影响外界及被外界影响,表现为对象自身状态的改变和信息的传递。
- 标识(identity):是指一个对象所具有的区别于所有其它对象的属性。(本质上指内存中所创建的对象的地址)
3、面向对象
面向对象程序设计(英语:Object-oriented programming,缩写:OOP)是一种程序设计范型,同时也是一种程序开发的方法。对象指的是类的实例。它将对象作为程序的基本单元,将程序和数据封装其中,以提高软件的重用性、灵活性和扩展性。
面向对象程序设计可以看作一种在程序中包含各种独立而又互相调用的对象的思想,这与传统的思想刚好相反:传统的程序设计主张将程序看作一系列函数的集合,或者直接就是一系列对电脑下达的指令。面向对象程序设计中的每一个对象都应该能够接受数据、处理数据并将数据传达给其它对象,因此它们都可以被看作一个小型的“机器”,即对象。
目前已经被证实的是,面向对象程序设计推广了程序的灵活性和可维护性,并且在大型项目设计中广为应用。 此外,支持者声称面向对象程序设计要比以往的做法更加便于学习,因为它能够让人们更简单地设计并维护程序,使得程序更加便于分析、设计、理解。反对者在某些领域对此予以否认。
当我们提到面向对象的时候,它不仅指一种程序设计方法。它更多意义上是一种程序开发方式。在这一方面,我们必须了解更多关于面向对象系统分析和面向对象设计(Object Oriented Design,简称OOD)方面的知识。
维基百科中这样定义了类:
在面向对象程式设计,类(class)是一种面向对象计算机编程语言的构造,是创建对象的蓝图,描述了所创建的对象共同的属性和方法。
类的更严格的定义是由某种特定的元数据所组成的内聚的包。它描述了一些对象的行为规则,而这些对象就被称为该类的实例。类有接口和结构。接口描述了如何通过方法与类及其实例互操作,而结构描述了一个实例中数据如何划分为多个属性。类是与某个层的对象的最具体的类型。类还可以有运行时表示形式(元对象),它为操作与类相关的元数据提供了运行时支持。
支持类的编程语言在支持与类相关的各种特性方面都多多少少有一些微妙的差异。大多数都支持不同形式的类继承。许多语言还支持提供封装性的特性,比如访问修饰符。类的出现,为面向对象编程的三个最重要的特性(封装性,继承性,多态性),提供了实现的手段。
看到这里,或许有一个认识,要OOP编程,就得用到类。可以这么说,虽然不是很严格。但是,反过来就不能说了。不是说用了类就一定是OOP。
编写类
对类的理解,需要有一定的抽象思维。因为类(Class)本身所定义的是某事物的抽象特点。例如定义一个类:
class Human: #这是定义类的方法,通常类的名称用首字母大写的单词或者单词拼接
pass
好,现在就从这里开始,编写一个类,不过这次我们暂时不用python,而是用伪代码,当然,这个代码跟python相去甚远。如下:
class Human:
四肢
性格
爱好
学习()
对象(Object)是类的实例。刚才已经定义了一个名字为Human的类,从而定义了世界上所有的Human,但是这是一个抽象的Human,不是具体某个人。而对一个具体的人,他的四肢特点、性格、爱好等都是具体的,这些东西在这里被称之为属性。
下面就找一个具体的人:张三,把上面的类实例化。
张三 = Human()
张三.四肢 = 修长
张三.爱好 = 看MM
在这里,张三就是Human这个类的一个实例。一个具体对象属性的值被称作它的“状态”。(系统给对象分配内存空间,而不会给类分配内存空间,这很好理解,类是抽象的系统不可能给抽象的东西分配空间,对象是具体的)