书签 分享 收藏 举报 版权申诉 / 43
上传文档赚钱

类型Python语言实用教程第6章-面向对象程序设计课件.ppt

  • 上传人(卖家):三亚风情
  • 文档编号:3515392
  • 上传时间:2022-09-10
  • 格式:PPT
  • 页数:43
  • 大小:1.23MB
  • 【下载声明】
    1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
    2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
    3. 本页资料《Python语言实用教程第6章-面向对象程序设计课件.ppt》由用户(三亚风情)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
    4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
    5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
    配套讲稿:

    如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。

    特殊限制:

    部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。

    关 键  词:
    Python 语言 实用教程 面向 对象 程序设计 课件
    资源描述:

    1、 Python语言支持面向对象程序设计。类和对象是面向对语言支持面向对象程序设计。类和对象是面向对象编程技术中最基本、最核心的概念与内容。本章将介绍象编程技术中最基本、最核心的概念与内容。本章将介绍Python语言面向对象程序设计相关的基本概念、类的声明、语言面向对象程序设计相关的基本概念、类的声明、对象的创建与使用等内容。利用继承不仅使得代码的重用性对象的创建与使用等内容。利用继承不仅使得代码的重用性得以提高,还可以清晰描述事物间的层次分类关系。得以提高,还可以清晰描述事物间的层次分类关系。Python提供了多继承机制,通过继承父类,子类可以获得父类所拥提供了多继承机制,通过继承父类,子类可

    2、以获得父类所拥有的方法和属性,并可以添加新的属性和方法来满足新事物有的方法和属性,并可以添加新的属性和方法来满足新事物的需求。简单来说,多态(意思是多种形式)就意味着父类的需求。简单来说,多态(意思是多种形式)就意味着父类型的变量可以引用子类型的对象,多态性也意指不同类型的型的变量可以引用子类型的对象,多态性也意指不同类型的对象可以响应相同的消息。对象可以响应相同的消息。Python语言中可谓一切皆对象语言中可谓一切皆对象。学习重点或难点:学习重点或难点:类的定义和使用类的定义和使用 对象的创建和使用对象的创建和使用 实例属性与类属性实例属性与类属性 方法方法 继承机制继承机制 多态和封装多态

    3、和封装6.1 面向对象概述面向对象概述6.2 类与对象类与对象6.3 实例属性与类属性实例属性与类属性6.4 方法方法6.5 继承继承6.6 多态和封装多态和封装6.7 应用实例应用实例面向对象技术基本概念有:面向对象技术基本概念有:类类(Class):用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象对象(Object):通过类定义的数据结构实例。对象包括两类数据成员(类变量和实例变量)和方法。实例化:实例化:创建一个类的实例,类的具体对象。类变量:类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用

    4、。数据成员:数据成员:类变量或者实例变量用于处理类及其实例对象的相关的数据。方法:方法:类中定义的函数。方法重载:方法重载:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(Override),也称为方法的重载。实例变量:实例变量:定义在方法中的变量,只作用于当前类的实例。继承:继承:即一个派生类(Derived Class)继承基类(Base Class)的字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。类的实例化为对象,创建了类才能由类创建对类的实例化为对象,创建了类才能由类创建对象。类与对象是面向对象程序设计的核心概念。象。类与对象是面向对象程

    5、序设计的核心概念。使用使用class语句来创建一个新类,语句来创建一个新类,class之后为类之后为类的名称并以冒号结尾,语法如下:的名称并以冒号结尾,语法如下:class ClassName:Optional class documentation string#类类帮助帮助文档文档 class_suite#类体类体类的帮助信息可以通过类的帮助信息可以通过ClassName._doc_查看。在函数、类或者文件开头的部分写查看。在函数、类或者文件开头的部分写文档字符串说明,一般采用三重引号。文档字符串说明,一般采用三重引号。class_suite 由类成员、方法由类成员、方法、数据属性等组成。

    6、、数据属性等组成。class Employee:雇员通用基类 empCount=0 def _init_(self,name,salary):self.name=name self.salary=salary Employee.empCount+=1 def displayCount(self):print(TotalEmployee%d%Employee.empCount)def displayEmployee(self):print(Name:,self.name,Salary:,self.salary)一个简单的一个简单的Python类类 要创建一个类的实例,你可以使用类的名称,并要创建

    7、一个类的实例,你可以使用类的名称,并通过通过_init_方法接受参数。方法接受参数。emp1=Employee(Zara,2000)#创建类创建类Employee的第的第1个对象个对象emp1 emp2=Employee(Manni,5000)#创建类创建类Employee的第的第2个对象个对象emp2 可以使用点可以使用点(.)来访问对象的方法或属性。也来访问对象的方法或属性。也可以使用如下类的名称访问类变量:可以使用如下类的名称访问类变量:emp1.displayEmployee();emp2.displayEmployee()print(Total Employee%d%Employee

    8、.empCount)还可以添加、删除、修改类的属性,如下所示:还可以添加、删除、修改类的属性,如下所示:emp1.age=7#添加一个添加一个 age 属性,这种方式是属性,这种方式是Python特有的特有的emp1.age=8#修改修改 age 属性属性del emp1.age#删除删除 age 属性属性 同同Java语言一样,语言一样,Python使用了引用计数这一简使用了引用计数这一简单技术来追踪内存中的对象。单技术来追踪内存中的对象。在在Python内部记录着所有使用中的对象各有多少内部记录着所有使用中的对象各有多少引用。引用。一个内部跟踪变量,称为一个引用计数器。当对一个内部跟踪变量

    9、,称为一个引用计数器。当对象被创建时,就创建了一个引用计数,当这个对象不象被创建时,就创建了一个引用计数,当这个对象不再需要时,也就是说,这个对象的引用计数变为再需要时,也就是说,这个对象的引用计数变为0 时时,它被垃圾回收。但是回收不是,它被垃圾回收。但是回收不是立即立即的,由解释器的,由解释器在适当的时机,将垃圾对象占用的内存空间回收。在适当的时机,将垃圾对象占用的内存空间回收。a=40#创建对象创建对象 b=a#增加引用增加引用 的计数的计数c=b#增加引用增加引用 的计数的计数del a#减少引用减少引用 的计数的计数b=100#减少引用减少引用 的计数的计数c0=-1#减少引用减少引

    10、用 的计数的计数 Python一切皆对象一切皆对象,每个对象都可能有多个,每个对象都可能有多个属性。一个类实例化后,实例是一个对象,有属性属性。一个类实例化后,实例是一个对象,有属性(实例属性实例属性)。同样,类也是一个对象,它也有属性。同样,类也是一个对象,它也有属性(类属性类属性)。class A(object):.x=7 .def _init_(self,y).self.y=y .A.x#7 在类在类A中,变量中,变量x所引用的数据,能够直接通过类来调所引用的数据,能够直接通过类来调用。或者说用。或者说x是类是类A的属性,这种属性称为的属性,这种属性称为“类属性类属性”。类。类属性仅限于

    11、此属性仅限于此类中的变量。它也有其他的名字,如静类中的变量。它也有其他的名字,如静态数据。态数据。类有一些缺省或预置的属性,叫作内置类属性,有如下这些:类有一些缺省或预置的属性,叫作内置类属性,有如下这些:1)_dict_:类的属性(包含一个字典,由类的数据属性组成);类的属性(包含一个字典,由类的数据属性组成);2)_doc_:类的文档字符串;:类的文档字符串;3)_name_:类名;类名;4)_module_:类定义所在的模块(类的全名是类定义所在的模块(类的全名是_main_.className,如果类位于一个导入模块,如果类位于一个导入模块mymod中,那么中,那么className.

    12、_module_ 等于等于 mymod););5)_bases_:类的所有父类构成元素(由所有父类组成的元组)类的所有父类构成元素(由所有父类组成的元组)实例(或对象)的属性储存在对象的实例(或对象)的属性储存在对象的_dict_属性属性中。中。_dict_为一个词典,键为属性名,对应的值为属为一个词典,键为属性名,对应的值为属性本身。为此,可以通过输出性本身。为此,可以通过输出_dict_这些内置属性来这些内置属性来查看对象属性等。示例详见书本。查看对象属性等。示例详见书本。方法与函数是一个概念,只是一般在类中的函方法与函数是一个概念,只是一般在类中的函数常称为方法。数常称为方法。在类的内部

    13、,在类的内部,使用使用def关键字可以为类关键字可以为类定义一个方法定义一个方法,与一般函数定义不同,与一般函数定义不同,类方类方法必须包含参数法必须包含参数self,且为第一个参数且为第一个参数:class People:#定义类定义类People age=0;name=John#定义类属性定义类属性#这里这里name与与self.name是不同的是不同的 _weight=0#定义私有属性,私有属性在类外部无法直接进行访问定义私有属性,私有属性在类外部无法直接进行访问 def _init_(self,name,age,weight):#定义构造方法定义构造方法 self.name=name;

    14、self.age=age self._weight=weight def speak(self):print(%s is speaking:I am%d years old.%(self.name,self.age)p=People(Tom,10,30);print(People.name,p.name)#John,Tomp.speak()#Tom is speaking:I am 10 years old 类里面的函数,第一个参数是类里面的函数,第一个参数是self,但,但是在实例化的时候,似乎没有这个参数什么是在实例化的时候,似乎没有这个参数什么事儿,那么事儿,那么self是干什么的呢?是

    15、干什么的呢?self是一个很是一个很神奇的参数。神奇的参数。在在People实例化的过程中实例化的过程中p=People(Tom,10,30),字符,字符串串Tom等通过初始化函数(等通过初始化函数(_init_())的参数已经存入到内)的参数已经存入到内存中,并且以存中,并且以People类型的形式存在,组成了一个对象,这类型的形式存在,组成了一个对象,这个对象和变量个对象和变量p建立引用关系。这个过程也可说成这些数据建立引用关系。这个过程也可说成这些数据附加到一个实例上。这样就能够以附加到一个实例上。这样就能够以:object.attribute的形式,的形式,在程序中任何地方调用某个数据

    16、,例如上面的程序中以在程序中任何地方调用某个数据,例如上面的程序中以p.name的方式得到的方式得到Tom。这种调用方式,在类和实例中经。这种调用方式,在类和实例中经常使用,点号常使用,点号“.”后面的称之为类或者实例的属性。这是在后面的称之为类或者实例的属性。这是在程序中,并且是在类的外面。如果在类的里面,想在某个地程序中,并且是在类的外面。如果在类的里面,想在某个地方使用实例化所传入的数据(如:方使用实例化所传入的数据(如:Tom),怎么办?),怎么办?在类内部,就是将所有传入的数据都赋给一个在类内部,就是将所有传入的数据都赋给一个变量,通常这个变量的名字是变量,通常这个变量的名字是sel

    17、f。在初始化函数中的第一个参数在初始化函数中的第一个参数self,就是起到了,就是起到了这个作用这个作用接收实例化过程中传入的所有数据,这接收实例化过程中传入的所有数据,这些数据是初始化函数后面的参数导入的些数据是初始化函数后面的参数导入的。显然,。显然,self应该就是一个实例(准确说法是应用实例),因为它应该就是一个实例(准确说法是应用实例),因为它所对应的就是具体数据。这个可以通过在所对应的就是具体数据。这个可以通过在_init_()函函数中通过数中通过print(self)或或print(type(self)来输出验证。来输出验证。self这个实例跟前面说的那个这个实例跟前面说的那个p

    18、所引用的实例对象所引用的实例对象一样,也有属性。那么,接下来就规定其属性和属性一样,也有属性。那么,接下来就规定其属性和属性对应的数据。上面代码中:对应的数据。上面代码中:self.name=name 就是规定了就是规定了self实例的一个属性,这个属性的名实例的一个属性,这个属性的名字也叫做字也叫做name,这个属性的值等于初始化函数的参,这个属性的值等于初始化函数的参数数name所导入的数据。注意,所导入的数据。注意,self.name中的中的name和和初始化函数的参数初始化函数的参数name没有任何关系,它们两个一没有任何关系,它们两个一样,只不过是一种起巧合(经常巧合,其实是为了省样

    19、,只不过是一种起巧合(经常巧合,其实是为了省事和以后识别方便,故意让它们巧合。)事和以后识别方便,故意让它们巧合。)_private_method 两个下划线开头,声明两个下划线开头,声明该方法为私有方法,不能在类地外部调用。该方法为私有方法,不能在类地外部调用。在类的内部调用在类的内部调用self._private_methods。类的专有方法:类的专有方法:私有方法介绍请查看:私有方法介绍请查看:https:/docs.Python.org/2.7/reference/datamodel.html#special-method-names 或https:/docs.Python.org/3

    20、.6/reference/datamodel.html#special-method-names _init_(self,.)就是类的构造方法就是类的构造方法(函数函数)或初或初始化方法始化方法(函数函数),该方法在创建类对象(类的实例化,该方法在创建类对象(类的实例化)时自动调用。)时自动调用。def _init_(self):self.data=_del_(self)就是类的析构方法就是类的析构方法(函数函数),_del_(self)在对象消逝的时候被自动调用。在对象消逝的时候被自动调用。例如:例如:已知,类的方法(或实例方法)第一个参数必须是已知,类的方法(或实例方法)第一个参数必须是s

    21、elf,并且如果要调用类的方法,必须将通过类的实例,即方法并且如果要调用类的方法,必须将通过类的实例,即方法绑定实例后才能由实例调用。如果调用不绑定方法,一般绑定实例后才能由实例调用。如果调用不绑定方法,一般在继承关系的类之间,可以用在继承关系的类之间,可以用super函数等方法调用。函数等方法调用。1、静态方法、静态方法 在类定义前出现在类定义前出现staticmethod,表示下面的方法是静,表示下面的方法是静态方法。态方法。2、类方法、类方法 在类定义前出现在类定义前出现classmethod,表示下面的方法是类方,表示下面的方法是类方法。法。命名空间是从所定义的命名到对象的映射集合命名

    22、空间是从所定义的命名到对象的映射集合。不同的命名空间,可以同时存在,当彼此相互独。不同的命名空间,可以同时存在,当彼此相互独立互不干扰。命名空间因为对象的不同也有所区别立互不干扰。命名空间因为对象的不同也有所区别,可以分为如下几种:,可以分为如下几种:作用域是指作用域是指Python程序可以直接访问到的命程序可以直接访问到的命名空间。名空间。“直接访问直接访问”在这里意味着访问命名空在这里意味着访问命名空间中的命名时无需加入附加的修饰符。间中的命名时无需加入附加的修饰符。def outer_foo():b=20 def inner_foo():c=30;#b=50#global b;b=50a

    23、=10 假如现在位于假如现在位于inner_foo()函数内,那么函数内,那么c就在就在本地作用域,而本地作用域,而b和和a就不是。如果在就不是。如果在inner_foo()内内再做:再做:b=50,这其实是在本地命名空间内新创建了,这其实是在本地命名空间内新创建了对象,和上一层中的对象,和上一层中的b=20毫不相干。这就是作用域毫不相干。这就是作用域的概念。的概念。如果要将某个变量在任何地方都使用,且能够如果要将某个变量在任何地方都使用,且能够关联,那么在函数内就使用关联,那么在函数内就使用global 声明,其实就是声明,其实就是曾经讲过的全局变量。曾经讲过的全局变量。继承(继承(Inhe

    24、ritance)是面向对象软件技术当)是面向对象软件技术当中的一个重要概念。面向对象的编程带来的主要中的一个重要概念。面向对象的编程带来的主要好处之一是代码的重用,实现这种重用的方法之好处之一是代码的重用,实现这种重用的方法之一是通过继承机制。一是通过继承机制。继承完全可以理解成类之间的父类型和子类型继承完全可以理解成类之间的父类型和子类型关系。如果一个类别关系。如果一个类别A“继承自继承自”另一个类别另一个类别B,就,就把这个把这个A称为称为“B的子类的子类”,而把,而把B称为称为“A的父类的父类”,也可以称,也可以称“B是是A的超类的超类”。继承可以使得子类具有父类的各种属性和方法继承可以

    25、使得子类具有父类的各种属性和方法,而不需要再次编写相同的代码。在令子类继承父,而不需要再次编写相同的代码。在令子类继承父类的同时,可以重新定义某些属性,并重写某些方类的同时,可以重新定义某些属性,并重写某些方法,即覆盖父类别的原有属性和方法,使其获得与法,即覆盖父类别的原有属性和方法,使其获得与父类不同的功能。另外,为子类追加新的属性和新父类不同的功能。另外,为子类追加新的属性和新方法也是常见的做法。方法也是常见的做法。需要注意的地方:继承语法需要注意的地方:继承语法 class 派生类名派生类名(基类基类名名):#.基类名写在括号里,基本类是在类定义的基类名写在括号里,基本类是在类定义的时候

    26、,在元组之中指明的。派生类即子类。语法:时候,在元组之中指明的。派生类即子类。语法:派生类的声明与定义父类类似,继承的基类列派生类的声明与定义父类类似,继承的基类列表跟在类名之后,如下所示:表跟在类名之后,如下所示:class SubClassName(ParentClass1,ParentClass2,.):可选的类文档说明可选的类文档说明 class_suite#类体类体 【例例6-1】父类与子类示例父类与子类示例Python可以继承多个类:可以继承多个类:class A:#定义定义class A.class B:#定义定义calss B.class C(A,B):#定义定义A and B

    27、的子类的子类.可以使用可以使用issubclass()或者或者isinstance()方法来检测。方法来检测。1)issubclass(sub,sup):布尔函数,判断一个类是另一个类:布尔函数,判断一个类是另一个类的子类或者子孙类。的子类或者子孙类。2)isinstance(obj,Class):布尔函数,如果:布尔函数,如果obj是是Class类的实类的实例对象或者是一个例对象或者是一个Class子类的实例对象则返回子类的实例对象则返回True。如果在继承元组中列了一个以上的类,那么它如果在继承元组中列了一个以上的类,那么它就被称作就被称作“多重继承多重继承”。继承的特点:继承的特点:即将

    28、父类的方法和属性全部承接即将父类的方法和属性全部承接到子类中;如果子类重写了父类的方法,就使用子到子类中;如果子类重写了父类的方法,就使用子类的该方法,父类的被遮盖类的该方法,父类的被遮盖。多重继承的顺序:经典类的搜索方式是按照多重继承的顺序:经典类的搜索方式是按照“从左至右,深度优先从左至右,深度优先”的方式去查找属性或方法的的方式去查找属性或方法的,而新式类(,而新式类(Python 3.x)的搜索方式是采用)的搜索方式是采用“广度广度优先优先”的方式的。的方式的。1、重载方法、重载方法 如果父类方法的功能不能满足需求,可以在子类重载父类如果父类方法的功能不能满足需求,可以在子类重载父类的

    29、方法,例如:的方法,例如:class Parent:#定义父类定义父类 def myMethod(self):print(Calling parent method)class Child(Parent):#定义子类定义子类 def myMethod(self):#这里是子类重载了父类的方法这里是子类重载了父类的方法 myMethod()print(Calling child method)c=Child()#子类实例子类实例c.myMethod()#子类调用重载方法子类调用重载方法 执行以上代码输出结果为:执行以上代码输出结果为:Calling child method2、基础重载方法、基础

    30、重载方法下面列出了一些通用的方法,可以在自己的类重写这些方法:下面列出了一些通用的方法,可以在自己的类重写这些方法:_init_(self,args.)构造函数,简单的调用方法:构造函数,简单的调用方法:obj=className(args)_del_(self)析构方法,删除一个对象简单的调用方法:析构方法,删除一个对象简单的调用方法:del obj_repr_(self)转化为供解释器读取的形式,简单的调用方法转化为供解释器读取的形式,简单的调用方法:repr(obj)_str_(self)用于将值转化为适于人阅读的形式,简单调用方用于将值转化为适于人阅读的形式,简单调用方法:法:str(

    31、obj)_cmp_(self,x)对象比较,简单的调用方法对象比较,简单的调用方法:cmp(obj,x)3、运算符重载、运算符重载Python同样支持运算符重载,如下:同样支持运算符重载,如下:class Vector:def _init_(self,a,b):self.a=a;self.b=b def _str_(self):return Vector(%d,%d)%(self.a,self.b)def _add_(self,other):return Vector(self.a+other.a,self.b+other.b)v1=Vector(2,10)v2=Vector(5,-2)pri

    32、nt(v1+v2)#Vector(7,8)#两个向量对象相加,发生运算符重载两个向量对象相加,发生运算符重载 在在Python中实现数据隐藏很简单,不需要在前中实现数据隐藏很简单,不需要在前面加什么关键字,只要把类变量名或成员函数前面面加什么关键字,只要把类变量名或成员函数前面加两个下划线即可实现数据隐藏的功能,这样,对加两个下划线即可实现数据隐藏的功能,这样,对于类的实例来说,其变量名和成员函数是不能使用于类的实例来说,其变量名和成员函数是不能使用的,对于其类的继承类来说,也是隐藏的,这样,的,对于其类的继承类来说,也是隐藏的,这样,其继承类可以定义其一模一样的变量名或成员函数其继承类可以定

    33、义其一模一样的变量名或成员函数名,而不会引起命名冲突。例如:名,而不会引起命名冲突。例如:Python不允许实例化的对象访问隐藏数据,但不允许实例化的对象访问隐藏数据,但可以使用可以使用object._className_attrName访问属性,访问属性,将如下代码替换上面程序的最后一行代码:将如下代码替换上面程序的最后一行代码:print(counter._JustCounter_secretCount)#输出:输出:2 要调用父类中被覆盖的方法或属性,需要调用要调用父类中被覆盖的方法或属性,需要调用super函数函数。super函数的语法格式:函数的语法格式:super(子类名子类名,s

    34、elf).父类的方法父类的方法 或或 super(子类名子类名,self).父类的属性父类的属性 super函数的参数,第一个是当前子类的类名字,第二个函数的参数,第一个是当前子类的类名字,第二个是是self,然后是点号,点号后面是所要调用的父类的方法,然后是点号,点号后面是所要调用的父类的方法(不需不需要要self参数了参数了)或属性。例如:或属性。例如:多态即多种形态,在执行时确定其状态,在编多态即多种形态,在执行时确定其状态,在编译阶段无法确定其类型,这就是多态。将对象的数译阶段无法确定其类型,这就是多态。将对象的数据与操作数据的方法相结合,通过方法将对象的数据与操作数据的方法相结合,通

    35、过方法将对象的数据与实现细节保护起来,就称为封装。外界只能通据与实现细节保护起来,就称为封装。外界只能通过对象方法访问对象,因此封装同时也实现了对象过对象方法访问对象,因此封装同时也实现了对象的数据隐藏。的数据隐藏。Python中的多态和中的多态和Java以及以及C+中的多态有点不同,中的多态有点不同,Python中的变量在定义时不用指明其类型。它会依据需要在执行时确定中的变量在定义时不用指明其类型。它会依据需要在执行时确定变量的类型,而且变量的类型,而且Python本身是一种解释性语言。不进行预编译本身是一种解释性语言。不进行预编译,因此它就仅仅在执行时确定其状态,因此它就仅仅在执行时确定其

    36、状态(即具体调用什么方法即具体调用什么方法)。故。故也有人说也有人说Python是一种多态语言。是一种多态语言。在在Python中非常多地方都能够体现多态的特性,比如内置函中非常多地方都能够体现多态的特性,比如内置函数数len(object)。len函数不仅能够计算字符串的长度,还能够计算函数不仅能够计算字符串的长度,还能够计算列表、元组等对象中的数据个数,这里在执行时通过参数类型确列表、元组等对象中的数据个数,这里在执行时通过参数类型确定其具体的计算过程,正是多态的一种体现。这有点类似于函数定其具体的计算过程,正是多态的一种体现。这有点类似于函数重载(一个编译单元中有多个同名函数,但参数不同

    37、),相当于重载(一个编译单元中有多个同名函数,但参数不同),相当于为每种类型都定义了一个为每种类型都定义了一个len函数。这是典型的多态表现。函数。这是典型的多态表现。本质上,多态意味着能够对不同的对象使用相同的操本质上,多态意味着能够对不同的对象使用相同的操作,但它们可能会以多种形态呈现出结果。作,但它们可能会以多种形态呈现出结果。len(object)函数函数就体现了这一点。而就体现了这一点。而Python是动态语言,动态地确定类型是动态语言,动态地确定类型信息恰恰体现了多态的特征。在信息恰恰体现了多态的特征。在Python中非常多内置函数中非常多内置函数和运算符都是多态的。譬如:和运算符

    38、都是多态的。譬如:This is a book.count(s)#2 1,2,4,3,5,3.count(3)#2 count()的作用是数一数某个元素在对象中出现的次数的作用是数一数某个元素在对象中出现的次数。f=lambda x,y:x+y f(2,3)#5 f(qiw,sir)#qiwsir f(Python,java,c+,lisp)#Python,java,c+,lisp lambda函数中,没有限制参数的类型,也一定不能函数中,没有限制参数的类型,也一定不能限制。在使用的时候,可以给参数任意类型,都能得到限制。在使用的时候,可以给参数任意类型,都能得到不报错结果。当然,这样做之所以

    39、合法,更多是来自于不报错结果。当然,这样做之所以合法,更多是来自于+功能强悍。功能强悍。封装是对全局作用域中其它区域隐藏多余信息封装是对全局作用域中其它区域隐藏多余信息的原则。封装机制帮助处理程序组件,而不用过多的原则。封装机制帮助处理程序组件,而不用过多关心多余细节,就像函数做的一样。封装与多态不关心多余细节,就像函数做的一样。封装与多态不同,多态的可以让用户对于不知道是什么类(或对同,多态的可以让用户对于不知道是什么类(或对象类型)的对象进行方法调用,而封装是可以不用象类型)的对象进行方法调用,而封装是可以不用关心对象是如何构建的而直接进行使用。关心对象是如何构建的而直接进行使用。创建一个

    40、对象(通过像调用函数一样调用类)后,将变创建一个对象(通过像调用函数一样调用类)后,将变量量c绑定到该对象上。可以使用绑定到该对象上。可以使用setName和和getName方法(假方法(假设类定义中已经有这些方法)。设类定义中已经有这些方法)。c=closedObject()c.setName(sir John)c.getName()#sir John Python中私有化的方法也比较简单,就是在准备私有化的中私有化的方法也比较简单,就是在准备私有化的属性(包括方法、数据)名字前面加双下划线。属性(包括方法、数据)名字前面加双下划线。_metaclass_=typeclass Protect

    41、Me:def _init_(self):self.me=qiwsir;self._name=kivi def _Python(self):print(I love Python.)def code(self):print(Which language do you like?);self._Python()p=ProtectMe();print(p.me)#qiwsirp.code()#Which language do you like?nI love Python.print(p._name)#不行会出错的,但可用:不行会出错的,但可用:print(p._ProtectMe_name)下面

    42、介绍另一种使用私有属性的方法。下面介绍另一种使用私有属性的方法。假设定义了一个类假设定义了一个类:C,该类必须继承自,该类必须继承自object类,有一私类,有一私有变量有变量_x。在该类中定义三个函数,分别用作赋值、取值和删。在该类中定义三个函数,分别用作赋值、取值和删除变量,请看如下示例。除变量,请看如下示例。class C(object):def _init_(self):self._x=None def getx(self):return self._x def setx(self,value):self._x=value def delx(self):del self._xx=pro

    43、perty(getx,setx,delx,Im the x property.)在 类 中 增 加 的在 类 中 增 加 的 p r o p e r t y()函 数 原 型 为:函 数 原 型 为:property(fget=None,fset=None,fdel=None,doc=None),根据需要定义相应的函数。通过根据需要定义相应的函数。通过property的定义,当的定义,当获取成员获取成员x的值时,就会调用的值时,就会调用getx函数,当给成员函数,当给成员x赋赋值时,就会调用值时,就会调用setx函数,当删除函数,当删除x时,就会调用时,就会调用delx函数。现在这个类中的函数。现在这个类中的x属性便已经定义好了,可以属性便已经定义好了,可以先定义一个先定义一个C的实例的实例c=C(),然后赋值,然后赋值c.x=100,取值,取值y=c.x,删除:,删除:del c.x。是不是很简单呢?。是不是很简单呢?【例例6-2】自定义实现一个迭代器。自定义实现一个迭代器。【例例6-3】类的单重继承实现。类的单重继承实现。【例例6-4】类的多重继承实现。类的多重继承实现。【例例6-5】测试构造方法与析构方法的自动调用。测试构造方法与析构方法的自动调用。【例例6-6】验证多重继承之广度优先的实现情况。验证多重继承之广度优先的实现情况。

    展开阅读全文
    提示  163文库所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
    关于本文
    本文标题:Python语言实用教程第6章-面向对象程序设计课件.ppt
    链接地址:https://www.163wenku.com/p-3515392.html

    Copyright@ 2017-2037 Www.163WenKu.Com  网站版权所有  |  资源地图   
    IPC备案号:蜀ICP备2021032737号  | 川公网安备 51099002000191号


    侵权投诉QQ:3464097650  资料上传QQ:3464097650
       


    【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。

    163文库