python学习-第6章 自定义功能单元(二)来自《21天学通Python》

第6章 自定义功能单元(二)

(1)以前章节中介绍的所有示例程序都属于面向过程的程序类型, Python语言其实也是一种面向对象的编程语言。Python中既可以用函数等面向过程的程序来解决相关的实际问题,也可以使用面向对象的方法完成相应的项目程序。因此,其灵活性是很强的。 **
(2)面向对象是当今高级编程语言大多具有的特性,在学习面向对象编 程前我们应该理解什么是程序中的对象、类的继承、面向对象的优点及 怎样进行面向对象的编程等面向对象的编程的基本思想。**
(3)其次,要学习 在Python中如何进行面向对象的编程。 本章主要介绍Python中面向对象编程的基本方法和基本思想,内容 包括:对象概述; 类与对象; 定义和使用类; 类的属性和方法; 类的继承; 类的方法重载。
6.1 面向对象编程概述
面向对象程序设计(Object Oriented Programming)简称OOP,面向 对象可以说是在计算机中通过编制程序的方式来模拟现实世界的物质运 行方式的一种编程方法。通过面向对象编程,使得数据的管理更加合理 和自动化,减少程序出错,少写代码,程序更加容易维护。
6.1.1 万物皆对象
(1)在早期的面向过程的编程中,所有使用的数据和函数之间是没有任何直接联系的,**它们之间联系的方式就是通过函数调用提供参数的形式将数据传入函数进行处理。**聪明的程序员们发现这并不符合现实世界的运行规律,**经常可能因为错误的传递参数、错误地修改了数据而导致程序出错,甚至是崩溃。当需要修改或维护程序时要从程序提供的一堆数 据中去寻找和修改它,**要扩展函数的功能,只能重新建立一个函数或修改它,所以其开发效率有点低。
(2)从现实世界得到的启发就是任何事物都具有自己的属性或能力,比 如一张桌子有高度、材质、颜色、重量等属性;但它无生命,自己不能 移动,也不具有完成其他动作的能力。再如一只小狗,也有毛色、重 量、年龄、体重等属性;它有生命,可以自己走路、奔跑、叫唤等,具 有自己的能力。
(3)那么,在程序中我们可以模仿现实世界,对现实世界中的事物进行有目的抽象,即抽象出现实世界事物中对我们有用的属性和能力来建立一个关联在一起的模型,对于现实世界中事物没有的属性或能力,而程序中需要的,则可以在程序中进行添加;对于现实世界中事物具有的属 性或能力,而程序中不需要关心的,则可以在程序中不进行表达。这种 抽象出来的模型我们称之为对象或类。
(4)面向对象编程就是通过面向对象分析和设计,建立模型(类或对 象)并完成最终程序的过程。因此,在面向对象编程中,编程的主体就 是用类或对象构建模型,并使它们之间可以互相通信以解决实际问题。
6.1.2 对象优越性
面向对象编程中的对象就是实际事物的模型或计算对象的模型,在 程序中以类方式进行定义。类从某种意义上来说仍旧是对现实世界的模 拟,它模拟的是现实世界中的各种事物,而现实世界中的各种事物都是 具有类别的。比如阔叶植物、厨房用具、猫等名词所指的都是一类事 物,在程序中定义的类就代表着同一类别的模型。
对象的优越性主要体现在以下几个方面:

封装:封装是指将对象的属性和能力包装在一起,需要对外展示的,其他对象才能得到或使用它,而不需要对外展示的细节,则隐藏在对象的内部。比如一台洗衣机,它展示在用户面前的就是一些控制开关与按钮,人们就可以使用它,而其内部的电路结构、电机等就是隐藏的细节。对于外部的你来说,不需要了解细节,可以通过按钮或开关来操纵它。同时,对象也使同一事物的属性与方法聚合在一起,而不能随便在别的什么地方定义。

继承:继承是指通过获取父对象的属性及能力,再加上自定义的属性和能 力而成为一个对象的子对象或一个类的子类。通过继承可以快速地对对 象进行建模,进而节省大量时间去写已经存在的代码,还可以又不失灵 活性地修改父对象的某些特性(属性和能力)。

包含:包含是指在对象建模的时候,还可以对对象模型进行细分。即将一 个对象划分为几部分,分别进行建模,最后将它们组装在一起成为一个 完整的对象。如对一张办公桌建模,可以先建立桌腿、桌面、抽屉等模 型,最后组装在一起成为完美的办公桌。

6.1.3 类和对象
具有相同属性或能力的模型在面向对象编程中以类进行定义和表示的,由类可以派生出(实例化)出同类的各个实例。就像一枚印章一 样,沾上不同颜色的墨水就可以印出不同颜色的文字或图形。仔细观察 的话,你即使使用了相同的墨水,多次印出的都应该属于不同的文字或 图形个体,但其表达的意义相同而己。刻制一枚印章可以理解为定义一 个类,印章的每一次使用可以理解为类的一次实例化。

在Python语言中,前面所讲的数据类型,其实也都是面向对象的。 例如对于整数类型(int),每一个整数都是整数类的实例;对于浮点数 类型,每一个实际的浮点数都是浮点数类的一个实例。
“对象”一词在面向对象编程中,根据上下文不同可以指“类”,也可 以指“实例”,由此可见,它不是一个很准确的称呼。
6.2 定义和使用类
各种不同的面向对象程序设计语言定义类和使用类的方式大多是大 同小异的,本节介绍Python语言中类的定义和使用方法。
6.2.1 定义类
在Python语言中定义类的基本形式为:
class <类名>(父类名):
pass
class 定义类的关键字;class语句行末尾要有一个“:”。
类名 符合标志符规范的名称;
父类名 该类继承的父类名称;
pass 空语句。
其中的父类名称是可选的,如果该类不继承其他类可以连同括号都 不写;pass语句表示什么也不做,常用来预留语句位置或临时未写等待以后完成,用一个单位缩进表示它属于这个类定义的一部分。
定义一个最简单的类只需要两行代码如下:
class MyClass:
pass
这个类表面上看什么都没有实现,也没有继承其他的类。但是在 Python中,没有继承其他类的类,会自动继承系统中内建的类object。 下面就是在交互式环境下看到的MyClass类中从object类继承到的属性与 方法,如图所示。
例1:
在这里插入图片描述
6.2.2 使用类
(1)类在定义后必须先实例化才能使用,类的实例化跟函数调用类似, 只要使用类名加圆括号的形式就可以实例化一个类。
(2)类实例化以后会生成该类的一个实例,一个类可以实例化成多个实 例,实例与实例之间并不会相互影响,类实例化以后就可以直接使用了。
例2:实例化类并显示相关信息
python学习-第6章 自定义功能单元(二)来自《21天学通Python》_第1张图片
从以上类的帮助信息中还可以看到,MyClass类自动继承了 builtins.object类,其后显示的属性就是从它继承而来的。 如果在类中定义了函数,也可以用类实例来调用它。一般来说,为了区分在类中定义的函数和类外定义的全局函数, 将类中定义的函数称为方法。以下文中出现的称呼便以此分类。
6.3 类的属性和方法
如前所述实例所定义的类MyClass只有一个说明信息,是没有什 么使用价值的。要用类来解决实际问题,就要定义一个具有一些属性和 方法的类,因为这才符合真实世界中的事物特征。
6.3.1 类的方法
(1)类的方法实际上为类的能力建模的,那么定义类的方法让类具有一 定的能动性。
(2)在类外部调用该类的方法就可以完成相应的功能,或改变 类的状态,或达到其他目的。
(3)类中的方法定义和调用与函数定义和调用的方式基本相同,其区别 有:方法的第一个参数必须是self,而且不能省略; 方法的调用需要实例化类,并以实例名.方法名(参数列表)形式 调用; 整体进行一个单位的缩进,表示其属于类体中的内容。
python学习-第6章 自定义功能单元(二)来自《21天学通Python》_第2张图片例3:
python学习-第6章 自定义功能单元(二)来自《21天学通Python》_第3张图片
【代码说明】代码中首先定义了一个具有两个方法info()和mycacl() 的类,然后实例化该类,并调用其两个方法。
定义方法时,也可以像定义函数一样声明各种形式的参数;方法 调用时,不用提供self参数。
在Python语言中的类定义中,可以定义一个特殊的构造方法,即 init()方法,用于类实例化时初始化相关数据,如果在这个方法中有 相关参数,则实例化时就必须提供。init()方法名中init前后分别为两个下画线。
例4:
python学习-第6章 自定义功能单元(二)来自《21天学通Python》_第4张图片
【代码说明】代码中定义了构造方法,此构造方法要求提供两个参 数x、y,其中y是具有默认值的参数。因此在实例化类时必须提供参 数,根据函数的调用规则可知,实例化时至少提供一个参数,也可以提 供两个参数。之后,分别以提供一个参数和两个参数的形式实例化类, 并调用其mycacl()方法。
**类中的方法既可以调用本类中的方法,也可以调用全局函数来完成 相关任务。调用全局函数和面向过程中的调用方式完成相同,而调用本 类中的方法应用使用以下形式: self.方法名(参数列表)**调用本类中的方法时提供的参数列表中也不应该包含“self”。
python学习-第6章 自定义功能单元(二)来自《21天学通Python》_第5张图片
例5:
python学习-第6章 自定义功能单元(二)来自《21天学通Python》_第6张图片
【代码说明】代码中首先定义了一个全局函数coord_chng(),然后 定义了一个类,类中定义了一个构造方法,并且在构造方法中也调用了 类中的其他方法(disp_point())。此后定义的move()方法同时调用了全 局函数coord_chng()和类中的两个方法(edit_point()和disp_point())。
【运行效果】如图所示,由于初始化类Ant类时没有给出参数, 所以使用了默认值0,0;然后调用move()方法,提供了参数2,4,因此 位置变为了(2,4);第三次调用提供了参数-9,6,位置变为了 (11,10)。
6.3.2 类的属性
类的属性是对类进行建模必不可少的内容,方法是用来操作数据的,而操作的大部分数据都类自身的属性,以改变类的状态,在Python 中类的属性定义方式和使用方式是很方便的。

参阅例5中的Ant类中,其实就已经定义了类的两个属性,它们是在构造方法中以直接赋值的方式定义的。因此,Python中定 义属性就是先直接使用它,可以在构造方法中定义属性,也可以在类中 的其他方法使用定义属性。
Python语言中类的属性有两类: 实例属性; 类属性。
实例属性即同一个类的不同实例,其值是不相关联的,也不会互相 影响的,定义时使用“self.属性名”,调用时也使用它;类属性则是同一 个类的所有实例所共有的,直接在类体中独立定义,引用时要使用“类 名.类变量名”形式来引用,只要是某个实例对其进行修改,就会影响 其他的所有这个类的实例。
例6:
python学习-第6章 自定义功能单元(二)来自《21天学通Python》_第7张图片
python学习-第6章 自定义功能单元(二)来自《21天学通Python》_第8张图片
python学习-第6章 自定义功能单元(二)来自《21天学通Python》_第9张图片
6.3.3 类成员方法与静态方法
类的属性有类属性和实例属性之分,类的方法也有不同的种类,主要有:实例方法; 类方法; 静态方法。

你可能感兴趣的:(Python自学,python)