1、Python3 程序设计 主讲教师:7 用类实现抽象和封装软件工程师系列Python3程序设计程序设计第7章 面向对象程序设计 本章内容本章内容 面向对象程序设计概述 创建类与对象 构造方法和析构方法 类的继承 类的多态 运算符重载 面向对象程序设计的应用比程序或函数更高层次的封装是面向对象程序设计,不仅封装了代码,也封装了操作的数据。面向对象使得软件开发更加灵活,更适用于大型软件的设计与开发。软件工程师系列Python3程序设计程序设计7.1 面向对象面向对象编程编程概述概述 面向对象程序设计的概念面向对象程序设计的概念1.面向对象程序设计 面向对象(OO)是符合人类思维习惯的编程思想。基于
2、面向对象思想的程序设计方法被称为面向对象的程序设计(Object Oriented Programming)。2.与面向过程程序设计的比较 把解决的问题按照一定规则划分为多个独立的对象,然后通过调用对象的方法来实现多个对象相互配合,完成应用程序功能。3.对象和类 对象(Object)将描述事物的一组数据和与这组数据有关操作封装在一起,形成一个实体,就是对象。具有相同或相似性质的对象的抽象就是类(Class)。软件工程师系列Python3程序设计程序设计7.1 面向对象面向对象编程编程概述概述 面向对象程序设计的特点面向对象程序设计的特点1.封装性 将数据和对数据的操作组织在一起,定义一个新类的
3、过程就是封装(Encapsulation)。2.继承性 继承(Inheritance)描述了类之间的关系。继承的类(子类)可以对被继承的类(父类)的操作进行扩展或重定义。3.多态性 多态(Polymarphism)指类中的方法重载,即一个类中有多个同名(不同参数)的方法,方法调用时,根据不同的参数选择执行不同的方法。本章围绕封装、继承、多态讲解Python的面向对象程序设计。软件工程师系列Python3程序设计程序设计7.2 创建类与对象 创建类创建类 面向对象的核心的是对象,创建对象之前先需要定义一个类。类是对象的抽象,用于描述一组对象的共同特征和行为。对象的特征(属性),用成员变量于描述,
4、对象的行为(方法)用成员方法描述。使用 class关键字来声明一个类。class 类名:类的属性(成员变量)类的方法(成员方法)软件工程师系列Python3程序设计程序设计7.2 创建类与对象 创建类创建类 类由3部分组成。类名:类的名称,通常它的的首字母大写。属性:用于描述事物的特征,比如人有姓名、年龄等。方法:用于描述事物的行为,比如,人有说话,微笑等行为。例7-1 创建类的示例。软件工程师系列Python3程序设计程序设计7.2 创建类与对象 创建对象创建对象 根据类创建对象。Python使用如下语法来创建一个对象。对象名=类名()例如,创建Dog类的一个对象dog。dog=Dog()d
5、og实际上是一个变量,可以使用它来访问类的属性和方法。可以给对象添加属性,格式如下:对象名.属性名值 例7-2 创建对象示例。软件工程师系列Python3程序设计程序设计7.3 构造方法和析构方法两个比较特殊的方法:_init_()和_del_(),分别用于初始化对象和释放对象所占用的资源。构造方法构造方法 类中名字为_init_()的方法(以两个下画线“_”开头和结尾)被称为构造方法。用于完成对象数据成员设置初值或进行其他必要的初始化工作。如果未定义构造方法,Python将提供一个默认的构造方法。例7-3 使用无参数的构造方法创建对象。例7-4 使得带参数的 _init_()方法的构造对象。
6、软件工程师系列Python3程序设计程序设计7.3 构造方法和析构方法 析构方法析构方法 Python中的_del_()方法是析构方法,与构造方法相反,用来释放对象占用的资源源。如果用户未定义析构方法,Python将提供一个默认的析构方法进行必要的清理工作。例7-5 使用析构方法删除对象。软件工程师系列Python3程序设计程序设计7.3 构造方法和析构方法 self参数参数 成员方法的第1个参数是 self。self的意思是自己,表示的是对象自身,当某个对象调用成员方法的时候,Python解释器会自动把当前对象作为第1个参数传给self,用户只需要传递后面的参数就可以了。成员方法的第1个参数
7、通常命名为self,但使用其他参数名也是合法的。例7-6 self参数的使用。软件工程师系列Python3程序设计程序设计7.3 构造方法和析构方法 成员变量和类成员变量和类变量变量 类中的变量分为两种类型:一种是成员变量,另一种是类变量。成员变量是在构造方法_init_()中定义的,定义时以self作为第1个参数;类变量是在类中方法之外定义的。在类的的外部,成员变量属于实例(对象),只能通过对象名访问;类变量属于类,可以通过类名访问,也可以通过对象名访问,被类的所有对象共享。例7-7 定义含有成员变量(名字name、颜色color)和类变量(数量num)的 Animal类。软件工程师系列Py
8、thon3程序设计程序设计7.3 构造方法和析构方法 类方法和静态方法类方法和静态方法 类中有以下4种方法:成员方法、普通方法、类方法、静态方法。成员方法由对象调用,方法的第1个参数默认是self,构造方法和析构方法也属于成员方法;普通的方法即类中的函数,只能由类名调用;类方法和静态方法都属于类的方法。软件工程师系列Python3程序设计程序设计7.3 构造方法和析构方法 类方法和静态方法类方法和静态方法1类方法类方法 使用修饰器classmethod来标识类方法。class 类名:classmethod def 类方法名(cls):方法体 格式中,类方法的第1个参数为cls,代表定义类方法的
9、类,通过cls参数可以访问类的属性 既可以通过对象名调用类方法,又可以通过类名调用类方法 例7-8 类中定义的实例方法和类方法。例7-9 类方法的应用。软件工程师系列Python3程序设计程序设计7.3 构造方法和析构方法 类方法和静态方法类方法和静态方法2.静态静态方法方法 使用修饰器staticmethod来标识静态方法。class 类名:staticmethod def 静态方法名():方法体 静态方法的参数列表中没有任何参数。由于静态方法没有self参数,所以它无法访问类的实例属性;静态方法也没有cls参数,所以它也无法访问类属性。静态方法跟定义它的类没有直接的关系,只是起到类似于函数
10、的作用。软件工程师系列Python3程序设计程序设计7.4 类的继承 继承的实现继承的实现 类的继承是指在一个现有类的基础上去构建一个新的类,构建出来的新类称作子类,被继承的类称作父类,子类会自动拥有父类所有可继承的属性和方法。class 子类名(父类名):类的属性 类的方法 例7-11 类的继承示例,子类继承父类的方法。以两个下划线“_”开头的属性是私有属性私有属性,只在类的内部访问。以两个下划线“_”开头的方法是私有方法私有方法,只在类的内部访问。软件工程师系列Python3程序设计程序设计7.4 类的继承 方法重写方法重写 在继承关系中,子类会自动拥有父类定义的方法。如果父类的方法不能满
11、足子类的需求,子类可以按照自己的方式重新实现从父类中继承的方法,这就是方法的重写方法的重写。重写使得子类中的方法覆盖掉跟父类同名的方法,但需要注意,在子类中重写的方法要和父类被重写的方法具有相同的方法名和参数列表。例7-13 子类重写父类的方法。super()方法用于在继承过程中访问父类的成员。软件工程师系列Python3程序设计程序设计7.4 类的继承 Python的多继承的多继承 一个子类存在多个父类的现象称为多继承。Python语言支持多继承,一个子类同时拥有多个父类的共同特征,即子类继承了多个父类的方法和属性。多继承是在子类名称后的括号中标注出要继承的多个父类,并且多个父类之间使用逗号
12、分隔。class 子类(父类):属性描述 方法描述 例7-14 多继承示例。软件工程师系列Python3程序设计程序设计7.5 类的多态 在同一个方法中,这种由于参数不同而导致执行效果各异的现象就是多态多态。在Java或C等强类型语言中,多态是指允许使用一个父类类型的变量来引用一个子类类型的对象来实现的。即根据引用子类对象特征的不同,得到不同的运行结果。Python的多态并不考虑对象的类型,而是关注对象具有的行为,根据被引用子类对象特征的不同,得到不同的运行结果。Python的多态并不要求继承的存在。但继承关系的存在,对多态起到约束作用,可以使程序更为健状。软件工程师系列Python3程序设计
13、程序设计7.6 运算符重载 运算符运算符重载重载 将运算符与类的方法关联起来,每个运算符对应一个指定的内置方法。Python支持运算符重载功能,可以重载加减乘除等运算,也可以重载打印、索引、比较等内置运算,重载方法如下表。方法名方法名运算符调用方式运算符调用方式_add_ x+y,x+=y_sub_x-y,x-=y_div_x/y,x/=y_mul_x*y,x*-=y_mod_x%y,x%=y_ _ r e p r _ _ 或或_str_print(x)、repr(x)、str()_getitem_xkey,xi:j_setitem_xkey,xi:j=sequence_delitem_del
14、 xkey,del xi:j_eq_,_ne_x=y,x!=y_lt_,_le_xy,xy,x=运算符。例7-17 _str_()方法重载和_ge_()方法重载的实现。软件工程师系列Python3程序设计程序设计7.6 运算符重载3.索引和切片重载索引和切片重载 跟索引和切片相关的重载方法包括如下3个。(1)_getitem_()方法用于索引、切片操作,在对象执行索引、切片或者for迭代操作时,会自动调用该方法。(2)_setitem_()方法索引赋值,在通过赋值语句给索引或者切片赋值时,调用 _setitem_()方法实现对序列对象的修改。(3)_ delitem_()方法使用del关键字删
15、除对象时,调用_ delitem_()方法实现删除。例7-18中,重写了_getitem_()方法、_setitem_()方法、_ delitem_()方法,实现对属性的索引、切片和删除操作。软件工程师系列Python3程序设计程序设计7.7 面向对象程序设计的应用 学生学生信息管理程序信息管理程序 下面的程序实现学生信息的遍历、追加、修改、删除和排序等功能,程序由3部分组成。学生类Student,成员变量有id(序号),name(姓名),course(课程),重载了_repr_()方法。学生的集合类StuList,承载多名学生信息。重载了索引和切片的方法。主控程序。软件工程师系列Python
16、3程序设计程序设计小结 面向对象程序设计中,类中的_init_()方法被称为构造方法,_del_()方法是析构方法。类中的属性也叫成员变量,分为两种类型:一种是实例属性,另一种是类属性。实例属性是在构造方法_init_()中定义的;类属性是在类中方法之外定义的属性。类中的方法分为成员方法、普通方法、类方法、静态方法。类的继承是指在一个现有类的基础上去构建一个新的类,构建出来的新类称作子类,被继承的类称作父类,子类会自动拥有父类所有可继承的属性和方法。一个子类存在多个父关的现象称为多继承。运算符重载指的是将运算符与类的方法关联起来,每个运算符对应一个内置方法。软件工程师系列Python3程序设计程序设计作业:(1)设计一个Student类,在该类中包括:一个数据成员score(分数)及两个类成员total(总分)和count(人数)。成员方法setScore(socre)用于设置分数,类方法sum()用于返回总分,类方法average()用于求平均值。交互式输入某班学生成绩,显示全班总分和平均分。(2)设计一个整形数组的封装类,要求实现下列功能:显示全部数组数据。显示从某位置开始的一段连续数组数据。软件工程师系列Python3程序设计程序设计