跟老齐学Python之关于类的初步认识


Posted in Python onOctober 11, 2014

在开始部分,请看官非常非常耐心地阅读下面几个枯燥的术语解释,本来这不符合本教程的风格,但是,请看官谅解,因为列位将来一定要阅读枯燥的东西的。这些枯燥的属于解释,均来自维基百科。

1、问题空间

问题空间是问题解决者对一个问题所达到的全部认识状态,它是由问题解决者利用问题所包含的信息和已贮存的信息主动地构成的。

一个问题一般有下面三个方面来定义:
 •初始状态——一开始时的不完全的信息或令人不满意的状况;
 •目标状态——你希望获得的信息或状态;
 •操作——为了从初始状态迈向目标状态,你可能采取的步骤。
 
这三个部分加在一起定义了问题空间(problem space)。

2、对象

对象(object),台湾译作物件,是面向对象(Object Oriented)中的术语,既表示客观世界问题空间(Namespace)中的某个具体的事物,又表示软件系统解空间中的基本元素。

在软件系统中,对象具有唯一的标识符,对象包括属性(Properties)和方法(Methods),属性就是需要记忆的信息,方法就是对象能够提供的服务。在面向对象(Object Oriented)的软件中,对象(Object)是某一个类(Class)的实例(Instance)。

3、面向对象

面向对象程序设计(英语:Object-oriented programming,缩写:OOP)是一种程序设计范型,同时也是一种程序开发的方法。对象指的是类的实例。它将对象作为程序的基本单元,将程序和数据封装其中,以提高软件的重用性、灵活性和扩展性。

面向对象程序设计可以看作一种在程序中包含各种独立而又互相调用的对象的思想,这与传统的思想刚好相反:传统的程序设计主张将程序看作一系列函数的集合,或者直接就是一系列对电脑下达的指令。面向对象程序设计中的每一个对象都应该能够接受数据、处理数据并将数据传达给其它对象,因此它们都可以被看作一个小型的“机器”,即对象。

目前已经被证实的是,面向对象程序设计推广了程序的灵活性和可维护性,并且在大型项目设计中广为应用。 此外,支持者声称面向对象程序设计要比以往的做法更加便于学习,因为它能够让人们更简单地设计并维护程序,使得程序更加便于分析、设计、理解。反对者在某些领域对此予以否认。

当我们提到面向对象的时候,它不仅指一种程序设计方法。它更多意义上是一种程序开发方式。在这一方面,我们必须了解更多关于面向对象系统分析和面向对象设计(Object Oriented Design,简称OOD)方面的知识。

下面再引用一段来自维基百科中关于OOP的历史。

面向对象程序设计的雏形,早在1960年的Simula语言中即可发现,当时的程序设计领域正面临着一种危机:在软硬件环境逐渐复杂的情况下,软件如何得到良好的维护?面向对象程序设计在某种程度上通过强调可重复性解决了这一问题。20世纪70年代的Smalltalk语言在面向对象方面堪称经典——以至于30年后的今天依然将这一语言视为面向对象语言的基础。

计算机科学中对象和实例概念的最早萌芽可以追溯到麻省理工学院的PDP-1系统。这一系统大概是最早的基于容量架构(capability based architecture)的实际系统。另外1963年Ivan Sutherland的Sketchpad应用中也蕴含了同样的思想。对象作为编程实体最早是于1960年代由Simula 67语言引入思维。Simula这一语言是奥利-约翰·达尔和克利斯登·奈加特在挪威奥斯陆计算机中心为模拟环境而设计的。(据说,他们是为了模拟船只而设计的这种语言,并且对不同船只间属性的相互影响感兴趣。他们将不同的船只归纳为不同的类,而每一个对象,基于它的类,可以定义它自己的属性和行为。)这种办法是分析式程序的最早概念体现。在分析式程序中,我们将真实世界的对象映射到抽象的对象,这叫做“模拟”。Simula不仅引入了“类”的概念,还应用了实例这一思想——这可能是这些概念的最早应用。
20世纪70年代施乐PARC研究所发明的Smalltalk语言将面向对象程序设计的概念定义为,在基础运算中,对对象和消息的广泛应用。Smalltalk的创建者深受Simula 67的主要思想影响,但Smalltalk中的对象是完全动态的——它们可以被创建、修改并销毁,这与Simula中的静态对象有所区别。此外,Smalltalk还引入了继承性的思想,它因此一举超越了不可创建实例的程序设计模型和不具备继承性的Simula。此外,Simula 67的思想亦被应用在许多不同的语言,如Lisp、Pascal。
面向对象程序设计在80年代成为了一种主导思想,这主要应归功于C++——C语言的扩充版。在图形用户界面(GUI)日渐崛起的情况下,面向对象程序设计很好地适应了潮流。GUI和面向对象程序设计的紧密关联在Mac OS X中可见一斑。Mac OS X是由Objective-C语言写成的,这一语言是一个仿Smalltalk的C语言扩充版。面向对象程序设计的思想也使事件处理式的程序设计更加广泛被应用(虽然这一概念并非仅存在于面向对象程序设计)。一种说法是,GUI的引入极大地推动了面向对象程序设计的发展。
苏黎世联邦理工学院的尼克劳斯·维尔特和他的同事们对抽象数据和模块化程序设计进行了研究。Modula-2将这些都包括了进去,而Oberon则包括了一种特殊的面向对象方法——不同于Smalltalk与C++。
面向对象的特性也被加入了当时较为流行的语言:Ada、BASIC、Lisp、Fortran、Pascal以及种种。由于这些语言最初并没有面向对象的设计,故而这种糅合常常会导致兼容性和维护性的问题。与之相反的是,“纯正的”面向对象语言却缺乏一些程序员们赖以生存的特性。在这一大环境下,开发新的语言成为了当务之急。作为先行者,Eiffel成功地解决了这些问题,并成为了当时较受欢迎的语言。
在过去的几年中,Java语言成为了广为应用的语言,除了它与C和C++语法上的近似性。Java的可移植性是它的成功中不可磨灭的一步,因为这一特性,已吸引了庞大的程序员群的投入。
在最近的计算机语言发展中,一些既支持面向对象程序设计,又支持面向过程程序设计的语言悄然浮出水面。它们中的佼佼者有Python、Ruby等等。
正如面向过程程序设计使得结构化程序设计的技术得以提升,现代的面向对象程序设计方法使得对设计模式的用途、契约式设计和建模语言(如UML)技术也得到了一定提升。

列位看官,当您阅读到这句话的时候,我就姑且认为您已经对面向对象有了一个模糊的认识了。那么,类和OOP有什么关系呢?

维基百科中这样定义了类:

在面向对象程式设计,类(class)是一种面向对象计算机编程语言的构造,是创建对象的蓝图,描述了所创建的对象共同的属性和方法。

 

类的更严格的定义是由某种特定的元数据所组成的内聚的包。它描述了一些对象的行为规则,而这些对象就被称为该类的实例。类有接口和结构。接口描述了如何通过方法与类及其实例互操作,而结构描述了一个实例中数据如何划分为多个属性。类是与某个层的对象的最具体的类型。类还可以有运行时表示形式(元对象),它为操作与类相关的元数据提供了运行时支持。

支持类的编程语言在支持与类相关的各种特性方面都多多少少有一些微妙的差异。大多数都支持不同形式的类继承。许多语言还支持提供封装性的特性,比如访问修饰符。类的出现,为面向对象编程的三个最重要的特性(封装性,继承性,多态性),提供了实现的手段。

看到这里,看官或许有一个认识,要OOP编程,就得用到类。可以这么说,虽然不是很严格。但是,反过来就不能说了。不是说用了类就一定是OOP。

编写类

对类的理解,需要看官有一定的抽象思维。因为类(Class)本身所定义的是某事物的抽象特点。例如定义一个类:

class Human:        #这是定义类的方法,通常类的名称用首字母大写的单词或者单词拼接

    pass

 好,现在就从这里开始,编写一个类,不过这次我们暂时不用python,而是用伪代码,当然,这个代码跟python相去甚远。如下:

class Human:

    四肢

    性格

    爱好

    学习()

 对象(Object)是类的实例。刚才已经定义了一个名字为Human的类,从而定义了世界上所有的Human,但是这是一个抽象的Human,不是具体某个人。而对一个具体的人,他的四肢特点、性格、爱好等都是具体的,这些东西在这里被称之为属性。

下面就找一个具体的人:王二麻子,把上面的类实例化。
王二麻子 = Human()
王二麻子.四肢 = 修长
王二麻子.爱好 = 看MM

 在这里,王二麻子就是Human这个类的一个实例。一个具体对象属性的值被称作它的“状态”。(系统给对象分配内存空间,而不会给类分配内存空间,这很好理解,类是抽象的系统不可能给抽象的东西分配空间,对象是具体的)

行文至此,看官是不是大概对类有了一个模糊的认识了呢?

鉴于类,距离我们的直观感觉似乎有点远。所以,要慢慢道来。本讲内容不多,盼望看官能理解。

Python 相关文章推荐
Python入门篇之对象类型
Oct 17 Python
Python实现的Google IP 可用性检测脚本
Apr 23 Python
Python中的匿名函数使用简介
Apr 27 Python
举例讲解Python设计模式编程中的访问者与观察者模式
Jan 26 Python
Python 爬虫多线程详解及实例代码
Oct 08 Python
python实现遍历文件夹修改文件后缀
Aug 28 Python
[原创]Python入门教程3. 列表基本操作【定义、运算、常用函数】
Oct 30 Python
python用plt画图时,cmp设置方法
Dec 13 Python
python安装numpy和pandas的方法步骤
May 27 Python
ubuntu 18.04 安装opencv3.4.5的教程(图解)
Nov 04 Python
Python中的np.argmin()和np.argmax()函数用法
Jun 02 Python
Python中的datetime包与time包包和模块详情
Feb 28 Python
跟老齐学Python之传说中的函数编写条规
Oct 11 #Python
python类继承用法实例分析
Oct 10 #Python
python中元类用法实例
Oct 10 #Python
跟老齐学Python之总结参数的传递
Oct 10 #Python
跟老齐学Python之变量和参数
Oct 10 #Python
跟老齐学Python之重回函数
Oct 10 #Python
跟老齐学Python之Python文档
Oct 10 #Python
You might like
基于文本的留言簿
2006/10/09 PHP
php桌面中心(一) 创建数据库
2007/03/11 PHP
php Http_Template_IT类库进行模板替换
2009/03/19 PHP
PHP实现获取FLV文件的时间
2015/02/10 PHP
ie和firefox中img对象区别的困惑
2006/12/27 Javascript
jquery控制listbox中项的移动并排序
2009/11/12 Javascript
jquery实现图片灯箱明暗的遮罩效果
2013/11/15 Javascript
js实现的类似于asp数据字典的数据类型代码实例
2014/09/03 Javascript
javascript常用的方法整理
2015/08/20 Javascript
javascript判断复选框是否选中的方法
2015/10/16 Javascript
jQuery 1.9.1源码分析系列(十)事件系统之主动触发事件和模拟冒泡处理
2015/11/24 Javascript
基于PHP和Mysql相结合使用jqGrid读取数据并显示
2015/12/02 Javascript
javascript运动效果实例总结(放大缩小、滑动淡入、滚动)
2016/01/08 Javascript
vue从使用到源码实现教程详解
2016/09/19 Javascript
基于vuejs实现一个todolist项目
2017/04/11 Javascript
JS实现图片点击后出现模态框效果
2017/05/03 Javascript
vue-cli如何引入bootstrap工具的方法
2017/10/19 Javascript
Javascript防止图片拉伸的自适应处理方法
2017/12/26 Javascript
Angular路由ui-router配置详解
2018/08/01 Javascript
react build 后打包发布总结
2018/08/24 Javascript
js中复选框的取值及赋值示例详解
2020/10/18 Javascript
Vue实现简易购物车页面
2020/12/30 Vue.js
python爬取各类文档方法归类汇总
2018/03/22 Python
Python统计单词出现的次数
2018/04/04 Python
python爬取淘宝商品销量信息
2018/11/16 Python
Django框架安装方法图文详解
2019/11/04 Python
tensorflow指定CPU与GPU运算的方法实现
2020/04/21 Python
Pandas的数据过滤实现
2021/01/15 Python
C#笔试题和英文面试题
2013/02/07 面试题
环境科学专业个人求职信
2013/09/26 职场文书
护理专科毕业推荐信
2013/11/10 职场文书
雷峰塔导游词
2015/02/09 职场文书
2015年七夕情人节活动方案
2015/05/06 职场文书
生日祝酒词大全
2015/08/10 职场文书
素质教育培训心得体会
2016/01/19 职场文书
DE1107机评
2022/04/05 无线电