Python 3 基础教程(第3版)(慕课版) 课件 第10章 面向对象_第1页
Python 3 基础教程(第3版)(慕课版) 课件 第10章 面向对象_第2页
Python 3 基础教程(第3版)(慕课版) 课件 第10章 面向对象_第3页
Python 3 基础教程(第3版)(慕课版) 课件 第10章 面向对象_第4页
Python 3 基础教程(第3版)(慕课版) 课件 第10章 面向对象_第5页
已阅读5页,还剩45页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Python3基础教程第3版慕课版单元10面向对象任务10-1:用类处理诗词【任务目标】定义一个类来处理诗词,程序输出结果如下。唐诗:塞下曲作者:卢纶月黑雁飞高,单于夜遁逃。欲将轻骑逐,大雪满弓刀。……【任务实施】演示过程……10.1Python类基础本节主要内容:理解Python的面向对象念定义和使用类对象的属性10.1.1理解Python的面向对象Python具有类、对象、继承、重载、多态等面向对象特性,但与C++、Java等支持面向对象的语言又有所不同。1.面向对象的基本概念类和对象:描述对象属性和方法的集合称为类,它定义了同一类对象所共有的属性和方法;对象是类的实例,也称实例对象。方法:类中定义的函数,用于描述对象的行为,也称方法属性。属性:类中在所有方法之外定义的变量(也称类的顶层变量),用于描述对象的特点,也称数据属性。封装:类具有封装特性,其内部实现不应被外部知晓,只需要提供必要的接口供外部访问即可。实例化:创建一个类的实例对象。继承:从一个超类(也称父类或基类)派生一个子类时,子类拥有超类的属性和方法,称为继承。子类可以定义自己的属性和方法。重载(override):在子类中定义与超类方法同名的方法,称为子类对超类方法的重载,也称方法重写。多态:指不同类型对象的相同行为产生不同的结果。与其他面向对象的程序设计语言相比,Python的面向对象更为简单。2.Python的类和类型Python的类使用class语句来定义,类通常包含一系列的赋值语句和函数定义。赋值语句定义类的属性,函数定义类的方法。在Python3中,类是一种自定义类型。Python的所有类型(包括自定义类型),都是内置类型type的实例对象,例如,内置的int、float、str等都是type类型的实例对象。type()函数可返回对象的类型,示例代码>>>type(int)<class'type'>>>>type(float)<class'type'>>>>type(str)<class'type'>>>>classtest: #定义一个空类...pass...>>>type(test)<class'type'>3.Python中的对象Python中的一切数据都是对象,如整数、小数、字符串、函数、模块等。例如,下面的代码分别测试了字符串、整数、逻辑值和函数的类型。>>>type('abc')<class'str'>>>>type(123)<class'int'>>>>type(True)<class'bool'>>>>deffun():...pass...>>>type(fun)<class'function'>Python中的对象可分为两种:类对象实例对象。类对象在执行class语句时创建。类对象是可调用的,类对象也称类实例。调用类对象会创建一个类的实例对象。类对象只有一个,而类的实例对象可以有多个。类对象和实例对象分别拥有自己的命名空间,在各自的命名空间内使用对象的属性和方法。1.类对象类对象具有下列几个主要特点。Python在执行class语句时创建一个类对象和一个变量(与类同名),变量引用类对象。与def类似,class也是可执行语句。导入类模块时,会执行class语句。类中的顶层赋值语句创建的变量是类的数据属性。类的数据属性用“对象名.属性名”格式来访问。类中的顶层def语句定义的函数是类的方法属性,用“对象名.方法名()”格式来访问。类的数据属性由类的所有实例对象共享。实例对象可读取类的数据属性值,但不能通过赋值语句修改类的数据属性值。2.实例对象实例对象具有下列主要特点。实例对象通过调用类对象来创建。每个实例对象继承类对象的所有属性,并获得自己的命名空间。实例对象拥有私有属性。通过赋值语句为实例对象的属性赋值时,如果该属性不存在,就会创建属于实例对象的私有属性。10.1.2定义和使用类本节主要内容:定义类使用类1.定义类类定义的基本格式如下。class类名:

赋值语句

赋值语句

…… def语句定义函数def语句定义函数

……classtestclass:data=100defsetpdata(self,value):self.pdata=valuedefshowpdata(self):print('self.pdata=',self.pdata)2.使用类使用类对象可访问类的属性、创建实例对象,示例代码如下。>>>type(testclass) #测试类对象的类型<class'type'>>>>testclass.data #访问类对象的数据属性100>>>x=testclass() #调用类对象创建第1个实例对象>>>type(x) #查看实例对象的类型,交互环境中的默认模块名称为__main__<class'__main__.testclass'> >>>x.setpdata('abc’) #调用方法创建实例对象的数据属性pdata>>>x.showpdata() #调用方法显示实例对象的数据属性pdata的值self.pdata=abc>>>y=testclass() #调用类对象创建第2个实例对象>>>y.setpdata(123) #调用方法创建实例对象的数据属性pdata>>>y.showpdata() #调用方法显示实例对象的数据属性pdata的值self.pdata=12310.1.3

对象的属性从面向对象的角度来说,属性表示对象的数据,在实现时通常用变量表示;方法表示对象的行为,实现时通常用函数表示。Python把类中的变量和函数统称为属性,分别称为数据属性和方法属性。在Python中,实例对象拥有类对象的所有属性。可以用dir()函数来查看对象的属性示例代码如下。#test10_06.py:查看对象的属性fromtest10_04importtest #导入类x=test(50) #创建实例对象print(dir(test)) #查看对象的属性1.共享属性类对象的数据属性由类的所有实例对象共享。test类的顶层赋值语句“data=100”定义了类对象的属性data,该属性可由所有实例对象共享。需要注意的是,类对象的属性由所有实例对象共享,其属性的值只能通过类对象来修改。可用del语句删除对象的属性,示例代码如下。#test10_07.py:使用类对象的共享属性fromtest10_04importtest #导入类x=test(50) #创建实例对象y=test(30) #创建实例对象print(x.data,y.data) #访问共享属性test.data=200 #通过类对象修改共享属性值print(x.data,y.data)test.data=300print(x.data,y.data,test.data) #此时访问的都是共享属性x.data="abc" #此时创建x的私有属性dataprint(x.data,y.data,test.data) #x.data访问的是x的私有属性datatest.data=400print(x.data,y.data,test.data)delx.data #此时删除x的私有属性dataprint(x.data) #x.data访问类对象的共享属性在以“实例对象.属性名”格式访问属性时:Python首先检查实例对象是否有匹配的私有属性,如果有则返回该属性的值;如果没有,则进一步检查类对象是否有匹配的共享属性,如果有则返回该属性的值;如果也没有,则产生AttributeError异常。2.实例对象的私有属性实例对象的私有属性指独属于实例对象的属性,私有属性在类外部可以以“实例对象名.属性名=值”格式赋值创建,或者在类的方法中以“self.属性名=值”格式赋值创建。“私有”强调属性只属于当前实例对象。实例对象默认拥有继承自类对象的所有属性,没有私有属性。只有通过赋值为实例对象创建私有属性,示例代码如下。#test10_08.py:使用实例对象的私有属性fromtest10_04importtest

#导入类x=test(100) #创建实例对象,初始化私有属性sdataprint(x.sdata) #访问实例对象的私有属性x.pdata=200 #创建私有属性print(x.pdata) #访问私有属3.对象的属性是动态的Python总是在第一次给变量赋值时创建变量。对于类对象或实例对象而言,当给不存在的属性赋值时,Python为其创建属性示例代码如下。#test10_09.py:对象属性的动态性fromtest10_04importtest

#导入类x=test(100) #创建实例对象,初始化私有属性sdatatest.data2="abc" #赋值,为类对象创建属性x.data3=[1,2] #赋值,为实例对象创建属性print(test.data2,x.data2,x.data3) #访问属性print(dir(test)) #查看类对象的属性列表print(dir(x))可以看到,赋值操作为对象添加了属性。而且,为类对象添加了属性时,实例对象也自动拥有了该属性。10.1.4对象的方法在通过实例对象访问方法时,Python会创建一个特殊对象:绑定方法对象,也称实例方法对象。此时,当前实例对象会作为一个参数传递给实例方法对象。所以在定义方法时,通常第一个参数名称为self。使用self只是惯例,重要的是位置,完全可以用其他的名称来代替self。通过类对象访问方法时,不会将类对象传递给方法,应按方法定义的形参个数提供参数,这和通过实例对象访问方法有所区别#test10_10.py:通过类对象调用方法classtest:defadd(a,b):returna+b #定义方法,完成加法defadd2(self,a,b):returna+b #定义方法,完成加法print(test.add(2,3)) #通过类对象调用方法print(test.add2(2,3,4)) #通过类对象调用方法,此时参数self的值为2x=test() #创建实例对象print(x.add2(2,3)) #通过实例对象调用方法,完成加法print(x.add(2,3)) #出错,输出信息显示函数接收到3个参10.1.5特殊属性和方法Python会为类对象添加一系列特殊属性,常用特殊属性如下。__name__:返回为类的名称。__module__:返回类所在模块的名称。__dict__:返回包含类命名空间的字典。__bases__:返回包含基类的元组,按其在基类列表中的出现顺序排列。__doc__:返回类的文档字符串,如果没有则为None。__class__:返回类对象的类型名称,与type()的返回结果相同。#test10_11.py:特殊属性classtest:"""这是test类的文档字符串"""pass#定义一个空类print(test.__name__)print(test.__module__)print(test.__dict__)print(test.__base__)print(test.__doc__)print(test.__class__)Python会为类对象添加一系列特殊方法,这些特殊方法在执行特定操作时被调用。可在定义类时定义这些方法,以取代默认方法,这称为方法的重载。类对象常用的特殊方法如下。__eq__():计算x==y时调用x.__eq__(y)。__ge__():计算x>=y时调用x.__ge__(y)。__gt__():计算x>y时调用x.__gt__(y)。__le__():计算x<=y时调用x.__le__(y)。__lt__():计算x<y时调用x.__lt__(y)。__ne__():计算x!=y时调用x.__ne__(y)。__format__():在内置函数format()和str.format()方法中格式化对象时调用,返回对象的格式化字符。__dir__():执行dir(x)时调用x.__dir__()。__delattr__():执行delx.data时调用x.__delattr__(data)。__getattribute__():访问对象属性时调用。例如,a=x.data等同于a=x.__getattribute__(data)。__setattr__():为对象属性赋值时调用。例如,x.data=a等同于x.__setattr__(a)。__hash__():调用内置函数hash(x)时,调用x.__hash__()。__new__():创建类的实例对象时调用。__init__():类的初始化函数。例如,x=test()语句在创建test类的实例对象时,首先调用__new__()创建一个新的实例对象,然后调用__init__()执行初始化操作。完成初始化之后再返回实例对象,同时建立变量x对实例对象的引用。__repr__():调用内置函数repr(x)的同时调用x.__repr__(),返回对象的字符串表示。__str__():通过str(x)、print(x)以及在format()中格式化x时调用x.__str__(),返回对象的字符串表示。10.1.6“伪私有”属性和方法在Python中,可以使用“类对象名.属性名”或“实例对象名.属性名”的格式在类的外部访问类的属性。在面向对象技术理论中,这种格式破坏了类的封装特性。Python提供了一种折中的方法,即使用双下画线作为属性和方法的名称前缀,从而使这些属性和方法不能直接在类的外部使用。以双下画线作为名称前缀的属性和方法称为类的“伪私有”属性和方法。Python在处理“伪私有”属性和方法的名称时,会加上“_类名”作为前缀。之所以称为“伪私有”,是因为只要使用正确的名称,在类的外部也可以访问“伪私有”属性和方法。可使用dir()函数查看类对象的“伪私有”属性和方法的真正名称。示例代码如下。#test10_12.py:“伪私有”属性和方法classtest:data=100__data2=200 #定义“伪私有”属性defadd(a,b):returna+bdef__sub(a,b): #定义“伪私有”方法returna-bprint(test.data) #访问普通属性print(test.add(2,3)) #访问普通方法print(test._test__data2) #访问“伪私有”属性print(test._test__sub(2,3)) #访问“伪私有”方法print(dir(test))print(test.__data2) #访问“伪私有”属性,出错,属性不存在10.1.7对象的初始化Python类的__init__()函数用于完成对象的初始化。如果没有为类定义__init__()函数,Python会自动添加该函数。类对象在执行__new__()函数创建完实例对象时,会立即调用__init__()函数对实例对象执行初始化操作。示例代码如下。#test10_13.py:对象的初始化classtest:def__init__(self,value): #定义对象的初始化方法self.data=value #为实例对象创建私有属性print("实例对象初始化完毕")x=test(100) #调用类对象创建实例对象,自动调用对象的初始化方法print(x.data) #输出实例对象已初始化的属性10.1.8静态方法可使用@staticmethod将方法声明为静态方法。通过实例对象调用静态方法时,不会像普通方法一样将实例对象本身作为隐含的第一个参数传递给方法。通过类对象和实例对象调用静态方法的效果完全相同。示例代码如下。#test10_14.py:静态方法classtest:@staticmethod #声明下面的add()为静态方法defadd(a,b):returna+bprint(test.add(2,3)) #通过类对象调用静态方法x=test() #创建实例对象print(x.add(3,5)) #通过实例对象调用静态方法任务10-2:用类表示圆和椭圆【任务目标】定义一个类表示圆,并将其作为超类定义一个表示椭圆的子类,程序输出结果如下。圆,面积:12.56椭圆,面积:18.84【任务实施】演示过程……10.2类的继承本节主要内容:简单继承扩展子类重继承调用超类的初始化函数使用模块中的类10.2.1简单继承通过继承来定义新类的基本格式如下。class子类名(超类名):

子类代码classsuper_class:#定义超类data=100__data2=200defshowinfo(self):print('超类showinfo()方法中的输出信息')def__showinfo(self):print('超类__showinfo()方法中的输出信息')classsub_class(super_class):#定义空的子类,pass表示空操作pass super=dir(super_class) #获得超类的属性和方法列表sub=dir(sub_class) #获得子类的属性和方法列表print(super==sub) #结果为True,说明超类和子类拥有的属性和方法相同print(sub_class.data) #访问继承的属性print(sub_class._super_class__data2)

#访问继承的属性x=sub_class() #创建子类的实例对象x.showinfo() #调用继承的方法x._super_class__showinfo() #调用继承的方法10.2.2扩展子类Python允许在子类中定义属性和方法。子类定义的属性和方法会覆盖超类中的同名属性和方法。在子类中定义与超类方法同名的方法,称为方法的重载,classsuper_class:#定义超类data1=10data2=20defshow1(self):print('在超类的show1()方法中的输出')defshow2(self):print('在超类的show2()方法中的输出')classsub(super_class): #定义子类data1=100 #覆盖超类的同名属性defshow1(self): #重载超类的同名方法print('在子类的show1()方法中的输出')print([xforxindir(sub)ifnotx.startswith('__')])

#显示子类的非内置属性x=sub() #创建子类的实例对象print(x.data1,x.data2)

#data1是子类自定义的属性,data2是子类继承的属性x.show1() #调用子类自定义的方法x.show2() #调用子类继承的方法在子类中,可用super()函数返回超类的类对象,从而通过它访问超类的方法。也可直接使用类对象调用超类的方法,示例代码如下。classsuper_class: #定义超类data1=10data2=20defshow1(self):print('self.data1=',self.data1)defshow2(self):print('self.data2=',self.data2)classsub(super_class):#定义子类data1=100defshow(self):super_class.show1(self)#调用超类的方法super().show2() #调用超类的方法x=sub()x.show1()x.show()10.2.3多重继承多重继承指子类可以同时继承多个超类。如果超类中存在同名的属性或方法,Python按照从左到右的顺序在超类中搜索方法10.2.4调用超类的初始化函数在子类的初始化函数中,通常应调用超类的初始化函数,Python不会自动调用超类的初始化函数,示例代码如下。#test10_20.py:调用超类的初始化函数

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论