Python语言程序设计第9章面向对象程序设计 配源代码课件_第1页
Python语言程序设计第9章面向对象程序设计 配源代码课件_第2页
Python语言程序设计第9章面向对象程序设计 配源代码课件_第3页
Python语言程序设计第9章面向对象程序设计 配源代码课件_第4页
Python语言程序设计第9章面向对象程序设计 配源代码课件_第5页
已阅读5页,还剩87页未读 继续免费阅读

下载本文档

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

文档简介

Python语言程序设计刘卫国第9章

面向对象程序设计

配源代码Python语言程序设计刘卫国19.1.1面向对象的基本概念1.对象

现实世界中客观存在的事物称作对象(object),任何对象都具有各自的特征(属性)和行为(方法)。

面向对象程序设计中的对象是现实世界中的客观事物在程序设计中的具体体现,它也具有自己的特征和行为。对象的特征用数据来表示,称为属性(property)。对象的行为用程序代码来实现,称为对象的方法(method)。总之,任何对象都是由属性和方法组成的。9.1面向对象程序设计概述9.1.1面向对象的基本概念9.1面向对象程序设计概22.类

类(class)是具有相同属性和行为的一组对象的集合,它为属于该类的全部对象提供了统一的抽象描述。任何对象都是某个类的实例(instance)。

在系统中通常有很多相似的对象,它们具有相同名称和类型的属性、响应相同的消息、使用相同的方法。将相似的对象分组形成一个类,每个这样的对象被称为类的一个实例,一个类中的所有对象共享一个公共的定义,尽管它们对属性所赋予的值不同。2.类33.消息一个系统由若干个对象组成,各个对象之间通过消息(message)相互联系、相互作用。消息是一个对象要求另一个对象实施某项操作的请求。发送者发送消息,在一条消息中,需要包含消息的接收者和要求接收者执行某项操作的请求,接收者通过调用相应的方法响应消息,这个过程被不断地重复,从而驱动整个程序的运行。3.消息44.封装

封装(encapsulation)是指把对象的数据(属性)和操作数据的过程(方法)结合在一起,构成独立的单元,它的内部信息对外界是隐蔽的,不允许外界直接存取对象的属性,只能通过使用类提供的外部接口对该对象实施各项操作,保证了程序中数据的安全性。

类是数据封装的工具,对象是封装的实现。类的访问控制机制体现在类的成员中可以有公有成员、私有成员和保护成员。对于外界而言,只需要知道对象所表现的外部行为,而不必了解内部实现细节。4.封装55.继承

继承(inheritance)反映的是类与类之间抽象级别的不同,根据继承与被继承的关系,可分为基类和衍类,基类也称为父类,衍类也称为子类,正如“继承”这个词的字面含义一样,子类将从父类那里获得所有的属性和方法,并且可以对这些获得的属性和方法加以改造,使之具有自己的特点。5.继承66.多态

多态(polymorphism)是指同一名字的方法产生了多个不同的动作行为,也就是不同的对象收到相同的消息时产生不同的行为方式。

将多态的概念应用于面向对象程序设计,增强了程序对客观世界的模拟性,使得对象程序具有了更好的可读性,更易于理解,而且显著提高了软件的可复用性和可扩充性。6.多态79.1.2从面向过程到面向对象

面向过程程序设计就是采用自顶向下的方法,分析出解决问题所需要的步骤,将程序分解为若干个功能模块,每个功能模块用函数来实现。

一个面向对象的程序一般由类的声明和类的使用两部分组成。程序设计始终围绕“类”展开。通过声明类,构建了程序所要完成的功能,体现了面向对象程序设计的思想。在Python中,所有数据类型都可以视为对象,当然也可以自定义对象。自定义的对象数据类型就是面向对象中的类的概念。9.1.2从面向过程到面向对象89.2.1类的定义

在Python中,通过class关键字来定义类。定义类的一般格式如下:class类名:

类体例如定义了一个Person类:classPerson:name='brenden'#定义了一个属性defprintName(self):#定义了一个方法print()9.2类与对象9.2.1类的定义9.2类与对象99.2.2对象的创建和使用

在Python中,用赋值的方式创建类的实例,一般格式为:

对象名=类名(参数列表)

创建对象后,可以使用“.”运算符,通过实例对象来访问这个类的属性和方法(函数),一般格式为:

对象名.属性名

对象名.函数名()

例如,语句“p=Person()”产生了一个Person的实例对象,此时可以用来调用类的name属性。9.2.2对象的创建和使用10例9-1类和对象应用示例。程序如下:classCC:x=10#定义属性y=20#定义属性z=30#定义属性defshow(self):#定义方法print((self.x+self.y+self.z)/3)b=CC()#创建实例对象bb.x=30#调用属性xb.show()#调用方法show程序输出结果如下:26.666666666666668例9-1类和对象应用示例。119.3.1属性和方法的访问控制1.属性的访问控制

在Python中没有像C++中public和private这些关键字来区别公有属性和私有属性,它是以属性命名方式来区分,如果在属性名前面加了两个下划线“__”,则表明该属性是私有属性,否则为公有属性。方法也一样,如果在方法名前面加了2个下划线,则表示该方法是私有的,否则为公有的。9.3属性和方法9.3.1属性和方法的访问控制9.3属性和方法12例如:classPerson:name='brenden'age=18p=Person()print(,p.age)

这里的name和age都是公有的,可以直接在类外通过对象名访问,如果想定义成私有的,则需在前面加2个下划线“__”。例如:132.方法的访问控制

在类中可以根据需要定义一些方法,定义方法采用def关键字,在类中定义的方法至少会有一个参数,,一般以名为“self”的变量作为该参数(用其他名称也可以),而且需要作为第一个参数。下面看一个例子。2.方法的访问控制14例9-2方法的访问控制使用示例。程序如下:classPerson:__name='brenden'__age=18defgetName(self):returnself.__namedefgetAge(self):returnself.__agep=Person()print(p.getName(),p.getAge())程序输出结果如下:

brenden18例9-2方法的访问控制使用示例。159.3.2类属性和实例属性1.类属性

顾名思义,类属性(classattribute)就是类对象所拥有的属性,它被所有类对象的实例对象所共有,在内存中只存在一个副本。对于公有的类属性,在类外可以通过类对象和实例对象访问。

9.3.2类属性和实例属性16例如:classPerson:name='brenden'#公有的类属性__age=18#私有的类属性p=Person()print()#正确,但不提倡print(P)#正确print(p.__age)#错误,不能在类外通过实例对象访问私有的类属性print(Person.__age)#错误,不能在类外通过类对象访问私有的类属性例如:172.实例属性

实例属性(instanceattribute)是不需要在类中显式定义,而在__init__构造函数中定义的,定义时以self作为前缀。在其他方法中也可以随意添加新的实例属性,但并不提倡这么做,所有的实例属性最好在__init__中给出。实例属性属于实例(对象),只能通过对象名访问。2.实例属性18例如:>>>classCar:def__init__(self,c):self.color=c#定义实例对象属性deffun(self):self.length=1.83#给实例添加属性,但不提倡>>>s=Car('Red')>>>print(s.color)Red>>>s.fun()>>>print(s.length)1.83例如:199.3.3类的方法1.类中

类中最常用的内置方法就是构造方法和析构方法。(1)构造方法

构造方法__init__(self,……)在生成对象时调用,可以用来进行一些属性初始化操作,不需要显式去调用,系统会默认去执行。构造方法支持重载,如果用户自己没有重新定义构造方法,系统就自动执行默认的构造方法。看下面的程序。9.3.3类的方法20例9-3构造方法使用示例。程序如下:classPerson:def__init__(self,name):self.PersonName=namedefsayHi(self):print('Hello,mynameis{}.'.format(self.PersonName))p=Person('Jasmine')p.sayHi()程序输出结果如下:Hello,mynameisJasmine.例9-3构造方法使用示例。21(2)析构方法

析构方法__del__(self)在释放对象时调用,支持重载,可以在其中进行一些释放资源的操作,不需要显式调用。下面的例子说明了类的普通成员函数以及构造方法和析构方法的作用。(2)析构方法22>>>classTest:def__init__(self):print('AAAAA')def__del__(self):print('BBBBB')defmyf(self):print('CCCCC')>>>obj=Test()AAAAA>>>obj.myf()CCCCC>>>delobjBBBBB>>>classTest:232.类方法、实例方法和静态方法(1)类方法

类方法是类对象所拥有的方法,需要用修饰器“@classmethod”来标识其为类方法,对于类方法,第一个参数必须是类对象,一般以“cls”作为第一个参数。当然可以用其他名称的变量作为其第一个参数,但是大都习惯以“cls”作为第一个参数的名字,所以一般用“cls”。能够通过实例对象和类对象去访问类方法。2.类方法、实例方法和静态方法24例如:>>>classPerson:place='Changsha'@classmethod#类方法,用@classmethod来进行修饰defgetPlace(cls):returncls.place>>>p=Person()>>>print(p.getPlace())#可以用过实例对象引用Changsha>>>print(Person.getPlace())#可以通过类对象引用Changsha例如:25

类方法还有一个用途就是可以对类属性进行修改。例如:>>>classPerson:place='Changsha'@classmethoddefgetPlace(cls):returncls.place@classmethoddefsetPlace(cls,place1):

cls.place=place1>>>p=Person()>>>p.setPlace('Shanghai')#修改类属性>>>print(p.getPlace())Shanghai>>>print(Person.getPlace())Shanghai类方法还有一个用途就是可以对类属性进行修改。例如:26(2)实例方法

实例方法是类中最常定义的成员方法,它至少有一个参数并且必须以实例对象作为其第一个参数,一般以名为'self'的变量作为第一个参数,当然可以以其他名称的变量作为第一个参数。在类外实例方法只能通过实例对象去调用,不能通过其他方式去调用。(2)实例方法27例如:>>>classPerson:place='Changsha'defgetPlace(self):#实例方法returnself.place>>>p=Person()>>>print(p.getPlace())#正确,可以用过实例对象引用Changsha>>>print(Person.getPlace())#错误,不能通过类对象引用实例方法例如:28(3)静态方法

静态方法需要通过修饰器“@staticmethod”来进行修饰,静态方法不需要多定义参数。例如:>>>classPerson:place='Changsha'@staticmethoddefgetPlace():#静态方法returnPerson.place>>>print(Person.getPlace())Changsha(3)静态方法299.4.1继承

在Python中,类继承的定义形式如下:

class子类名(父类名):

类体

在定义一个类的时候,可以在类名后面紧跟一对括号,在括号中指定所继承的父类,如果有多个父类,多个父类名之间用逗号隔开。9.4继承和多态9.4.1继承9.4继承和多态30例9-4以大学里的学生和教师为例,可以定义一个父类UniversityMember,然后类Student和类Teacher分别继承类UniversityMember。例9-4以大学里的学生和教师为例,可以定义一个父类Uni319.4.2多重继承

多重继承的定义形式是:

class子类名(父类名1,父类名2,……):

类体9.4.2多重继承32例9-5多重继承程序示例。程序如下:classA():deffoo1(self):print("AAAAA")classB(A):deffoo2(self):print("BBBBB")classC(A):deffoo1(self):print("CCCCC")classD(B,C):passd=D()d.foo1()程序在Python3.x环境下的输出结果是:CCCCC程序在Python2.x环境下的输出结果是:AAAAA例9-5多重继承程序示例。339.4.3多态

多态性多态即多种形态,是指不同的对象收到同一种消息时会产生不同的行为。在程序中消息就是调用函数,不同的行为就是指不同的实现方法,即执行不同的函数。

在Python中很多地方都可以体现多态的特性,例如内置函数len(),len函数不仅可以计算字符串的长度,还可以计算列表、元组等对象中的数据个数,这里在运行时通过参数类型确定其具体的计算过程,正是多态的一种体现。9.4.3多态34例9-7已知y=

,当f(n)=1×2+2×3+3×4+……+n×(n+1)时,求y的值。分析:为了说明面向过程程序设计和面向对象程序设计的区别,分别用面向过程方法和面向对象方法来写程序。9.5面向对象程序设计应用举例例9-7已知y=,当f(n)=1×2+2×3+335例9-8用面向对象方法编写例4-11对应的程序。例9-8用面向对象方法编写例4-11对应的程序。36例9-9某商店销售某一商品,允许销售人员在一定范围内灵活掌握售价(price),现已知当天3名销货员的销售情况为:销货员号(num)

销货件数(quantity)

销货单价(price)101523.51021224.5610310021.5编写程序,计算当日此商品的总销售款sum以及每件商品的平均售价。分析:利用字典来组织数据,以销货员号作为字典关键字,通过关键字遍历字典。例9-9某商店销售某一商品,允许销售人员在一定范围内灵活37配套源代码例9-1程序如下:classCC:x=10#定义属性y=20#定义属性z=30#定义属性defshow(self):#定义方法print((self.x+self.y+self.z)/3)b=CC()#创建实例对象bb.x=30#调用属性xb.show()#调用方法show配套源代码例9-1程序如下:38配套源代码例9-2程序如下:classPerson:__name='brenden'__age=18defgetName(self):returnself.__namedefgetAge(self):returnself.__agep=Person()print(p.getName(),p.getAge())

配套源代码例9-2程序如下:39配套源代码例9-3程序如下:classPerson:def__init__(self,name):self.PersonName=namedefsayHi(self):print('Hello,mynameis{}.'.format(self.PersonName))p=Person('Jasmine')p.sayHi()配套源代码例9-3程序如下:40例9-4程序如下:classUniversityMember:#定义父类def__init__(self,name,age):=nameself.age=ageprint('initUniversityMember:',)deftell(self):print('name:{};age:{}'.format(,self.age))classStudent(UniversityMember):#定义子类Studentdef__init__(self,name,age,marks):UniversityMember.__init__(self,name,age)self.marks=marksprint('initStudent:',)deftell(self):UniversityMember.tell(self)print('marks:',self.marks)classTeacher(UniversityMember):#定义子类Teacherdef__init__(self,name,age,salary):UniversityMember.__init__(self,name,age)#显式调用父类构造方法self.salary=salaryprint('initTeacher:',)deftell(self):UniversityMember.tell(self)print('salary:',self.salary)s=Student('Brenden',18,92)t=Teacher('Jasmine',28,2450)members=[s,t]printformemberinmembers:member.tell()例9-4程序如下:classTeacher(Unive41配套源代码例9-5程序如下:classA():deffoo1(self):print("AAAAA")classB(A):deffoo2(self):print("BBBBB")classC(A):deffoo1(self):print("CCCCC")classD(B,C):passd=D()d.foo1()配套源代码例9-5程序如下:42例9-6程序如下:classbase(object):def__init__(self,name):=namedefshow(self):print("baseclass:",)classsubclass1(base):defshow(self):print("subclass1:",)classsubclass2(base):defshow(self):print("subclass2:",)classsubclass3(base):passdeftestFunc(o):o.show()first=subclass1("1")second=subclass2("2")third=subclass3("3")lst=[first,second,third]forpinlst:testFunc(p)例9-6程序如下:43例9-7面向过程方法的程序如下:deff(n):#定义求f(n)的函数s=0foriinrange(1,n+1):s+=i*(i+1)returnsy=f(40)/(f(30)+f(20))print('y=',y)

面向对象方法的程序如下:classcalculate:def__init__(self,n):self.n=ndeff(self):#求f(n)的成员函数s=0foriinrange(1,self.n+1):

s+=i*(i+1)returnsob1=calculate(40)ob2=calculate(30)ob3=calculate(20)y=ob1.f()/(ob2.f()+ob3.f())print('y=',y)例9-7面向过程方法的程序如下:44例9-8程序如下:classcompute:defyn(self):#计算y和n的函数self.n=1self.y=0.0whileself.y<3.0:self.f=1.0/(2*self.n-1)self.y+=self.fself.n+=1self.y=self.y-self.fself.n=self.n-2defprint(self):#输出结果的函数print("y={0},n={1}".format(self.y,self.n))defmain():#主函数obj=compute()obj.yn()obj.print()main()例9-8程序如下:45例9-9程序如下:classProduct:deftotal(self):prod={'101':[5,23.5],'102':[12,24.56],'103':[100,21.5]}self.sum=0.0self.n=0forkeyinprod.keys():quantity=prod[key][0]price=prod[key][1]self.sum+=quantity*priceself.n+=quantitydefdisplay(self):print(self.sum)print(self.sum/self.n)defmain():ob=Product()ob.total()ob.display()main()例9-9程序如下:46Python语言程序设计刘卫国第9章

面向对象程序设计

配源代码Python语言程序设计刘卫国479.1.1面向对象的基本概念1.对象

现实世界中客观存在的事物称作对象(object),任何对象都具有各自的特征(属性)和行为(方法)。

面向对象程序设计中的对象是现实世界中的客观事物在程序设计中的具体体现,它也具有自己的特征和行为。对象的特征用数据来表示,称为属性(property)。对象的行为用程序代码来实现,称为对象的方法(method)。总之,任何对象都是由属性和方法组成的。9.1面向对象程序设计概述9.1.1面向对象的基本概念9.1面向对象程序设计概482.类

类(class)是具有相同属性和行为的一组对象的集合,它为属于该类的全部对象提供了统一的抽象描述。任何对象都是某个类的实例(instance)。

在系统中通常有很多相似的对象,它们具有相同名称和类型的属性、响应相同的消息、使用相同的方法。将相似的对象分组形成一个类,每个这样的对象被称为类的一个实例,一个类中的所有对象共享一个公共的定义,尽管它们对属性所赋予的值不同。2.类493.消息一个系统由若干个对象组成,各个对象之间通过消息(message)相互联系、相互作用。消息是一个对象要求另一个对象实施某项操作的请求。发送者发送消息,在一条消息中,需要包含消息的接收者和要求接收者执行某项操作的请求,接收者通过调用相应的方法响应消息,这个过程被不断地重复,从而驱动整个程序的运行。3.消息504.封装

封装(encapsulation)是指把对象的数据(属性)和操作数据的过程(方法)结合在一起,构成独立的单元,它的内部信息对外界是隐蔽的,不允许外界直接存取对象的属性,只能通过使用类提供的外部接口对该对象实施各项操作,保证了程序中数据的安全性。

类是数据封装的工具,对象是封装的实现。类的访问控制机制体现在类的成员中可以有公有成员、私有成员和保护成员。对于外界而言,只需要知道对象所表现的外部行为,而不必了解内部实现细节。4.封装515.继承

继承(inheritance)反映的是类与类之间抽象级别的不同,根据继承与被继承的关系,可分为基类和衍类,基类也称为父类,衍类也称为子类,正如“继承”这个词的字面含义一样,子类将从父类那里获得所有的属性和方法,并且可以对这些获得的属性和方法加以改造,使之具有自己的特点。5.继承526.多态

多态(polymorphism)是指同一名字的方法产生了多个不同的动作行为,也就是不同的对象收到相同的消息时产生不同的行为方式。

将多态的概念应用于面向对象程序设计,增强了程序对客观世界的模拟性,使得对象程序具有了更好的可读性,更易于理解,而且显著提高了软件的可复用性和可扩充性。6.多态539.1.2从面向过程到面向对象

面向过程程序设计就是采用自顶向下的方法,分析出解决问题所需要的步骤,将程序分解为若干个功能模块,每个功能模块用函数来实现。

一个面向对象的程序一般由类的声明和类的使用两部分组成。程序设计始终围绕“类”展开。通过声明类,构建了程序所要完成的功能,体现了面向对象程序设计的思想。在Python中,所有数据类型都可以视为对象,当然也可以自定义对象。自定义的对象数据类型就是面向对象中的类的概念。9.1.2从面向过程到面向对象549.2.1类的定义

在Python中,通过class关键字来定义类。定义类的一般格式如下:class类名:

类体例如定义了一个Person类:classPerson:name='brenden'#定义了一个属性defprintName(self):#定义了一个方法print()9.2类与对象9.2.1类的定义9.2类与对象559.2.2对象的创建和使用

在Python中,用赋值的方式创建类的实例,一般格式为:

对象名=类名(参数列表)

创建对象后,可以使用“.”运算符,通过实例对象来访问这个类的属性和方法(函数),一般格式为:

对象名.属性名

对象名.函数名()

例如,语句“p=Person()”产生了一个Person的实例对象,此时可以用来调用类的name属性。9.2.2对象的创建和使用56例9-1类和对象应用示例。程序如下:classCC:x=10#定义属性y=20#定义属性z=30#定义属性defshow(self):#定义方法print((self.x+self.y+self.z)/3)b=CC()#创建实例对象bb.x=30#调用属性xb.show()#调用方法show程序输出结果如下:26.666666666666668例9-1类和对象应用示例。579.3.1属性和方法的访问控制1.属性的访问控制

在Python中没有像C++中public和private这些关键字来区别公有属性和私有属性,它是以属性命名方式来区分,如果在属性名前面加了两个下划线“__”,则表明该属性是私有属性,否则为公有属性。方法也一样,如果在方法名前面加了2个下划线,则表示该方法是私有的,否则为公有的。9.3属性和方法9.3.1属性和方法的访问控制9.3属性和方法58例如:classPerson:name='brenden'age=18p=Person()print(,p.age)

这里的name和age都是公有的,可以直接在类外通过对象名访问,如果想定义成私有的,则需在前面加2个下划线“__”。例如:592.方法的访问控制

在类中可以根据需要定义一些方法,定义方法采用def关键字,在类中定义的方法至少会有一个参数,,一般以名为“self”的变量作为该参数(用其他名称也可以),而且需要作为第一个参数。下面看一个例子。2.方法的访问控制60例9-2方法的访问控制使用示例。程序如下:classPerson:__name='brenden'__age=18defgetName(self):returnself.__namedefgetAge(self):returnself.__agep=Person()print(p.getName(),p.getAge())程序输出结果如下:

brenden18例9-2方法的访问控制使用示例。619.3.2类属性和实例属性1.类属性

顾名思义,类属性(classattribute)就是类对象所拥有的属性,它被所有类对象的实例对象所共有,在内存中只存在一个副本。对于公有的类属性,在类外可以通过类对象和实例对象访问。

9.3.2类属性和实例属性62例如:classPerson:name='brenden'#公有的类属性__age=18#私有的类属性p=Person()print()#正确,但不提倡print(P)#正确print(p.__age)#错误,不能在类外通过实例对象访问私有的类属性print(Person.__age)#错误,不能在类外通过类对象访问私有的类属性例如:632.实例属性

实例属性(instanceattribute)是不需要在类中显式定义,而在__init__构造函数中定义的,定义时以self作为前缀。在其他方法中也可以随意添加新的实例属性,但并不提倡这么做,所有的实例属性最好在__init__中给出。实例属性属于实例(对象),只能通过对象名访问。2.实例属性64例如:>>>classCar:def__init__(self,c):self.color=c#定义实例对象属性deffun(self):self.length=1.83#给实例添加属性,但不提倡>>>s=Car('Red')>>>print(s.color)Red>>>s.fun()>>>print(s.length)1.83例如:659.3.3类的方法1.类中

类中最常用的内置方法就是构造方法和析构方法。(1)构造方法

构造方法__init__(self,……)在生成对象时调用,可以用来进行一些属性初始化操作,不需要显式去调用,系统会默认去执行。构造方法支持重载,如果用户自己没有重新定义构造方法,系统就自动执行默认的构造方法。看下面的程序。9.3.3类的方法66例9-3构造方法使用示例。程序如下:classPerson:def__init__(self,name):self.PersonName=namedefsayHi(self):print('Hello,mynameis{}.'.format(self.PersonName))p=Person('Jasmine')p.sayHi()程序输出结果如下:Hello,mynameisJasmine.例9-3构造方法使用示例。67(2)析构方法

析构方法__del__(self)在释放对象时调用,支持重载,可以在其中进行一些释放资源的操作,不需要显式调用。下面的例子说明了类的普通成员函数以及构造方法和析构方法的作用。(2)析构方法68>>>classTest:def__init__(self):print('AAAAA')def__del__(self):print('BBBBB')defmyf(self):print('CCCCC')>>>obj=Test()AAAAA>>>obj.myf()CCCCC>>>delobjBBBBB>>>classTest:692.类方法、实例方法和静态方法(1)类方法

类方法是类对象所拥有的方法,需要用修饰器“@classmethod”来标识其为类方法,对于类方法,第一个参数必须是类对象,一般以“cls”作为第一个参数。当然可以用其他名称的变量作为其第一个参数,但是大都习惯以“cls”作为第一个参数的名字,所以一般用“cls”。能够通过实例对象和类对象去访问类方法。2.类方法、实例方法和静态方法70例如:>>>classPerson:place='Changsha'@classmethod#类方法,用@classmethod来进行修饰defgetPlace(cls):returncls.place>>>p=Person()>>>print(p.getPlace())#可以用过实例对象引用Changsha>>>print(Person.getPlace())#可以通过类对象引用Changsha例如:71

类方法还有一个用途就是可以对类属性进行修改。例如:>>>classPerson:place='Changsha'@classmethoddefgetPlace(cls):returncls.place@classmethoddefsetPlace(cls,place1):

cls.place=place1>>>p=Person()>>>p.setPlace('Shanghai')#修改类属性>>>print(p.getPlace())Shanghai>>>print(Person.getPlace())Shanghai类方法还有一个用途就是可以对类属性进行修改。例如:72(2)实例方法

实例方法是类中最常定义的成员方法,它至少有一个参数并且必须以实例对象作为其第一个参数,一般以名为'self'的变量作为第一个参数,当然可以以其他名称的变量作为第一个参数。在类外实例方法只能通过实例对象去调用,不能通过其他方式去调用。(2)实例方法73例如:>>>classPerson:place='Changsha'defgetPlace(self):#实例方法returnself.place>>>p=Person()>>>print(p.getPlace())#正确,可以用过实例对象引用Changsha>>>print(Person.getPlace())#错误,不能通过类对象引用实例方法例如:74(3)静态方法

静态方法需要通过修饰器“@staticmethod”来进行修饰,静态方法不需要多定义参数。例如:>>>classPerson:place='Changsha'@staticmethoddefgetPlace():#静态方法returnPerson.place>>>print(Person.getPlace())Changsha(3)静态方法759.4.1继承

在Python中,类继承的定义形式如下:

class子类名(父类名):

类体

在定义一个类的时候,可以在类名后面紧跟一对括号,在括号中指定所继承的父类,如果有多个父类,多个父类名之间用逗号隔开。9.4继承和多态9.4.1继承9.4继承和多态76例9-4以大学里的学生和教师为例,可以定义一个父类UniversityMember,然后类Student和类Teacher分别继承类UniversityMember。例9-4以大学里的学生和教师为例,可以定义一个父类Uni779.4.2多重继承

多重继承的定义形式是:

class子类名(父类名1,父类名2,……):

类体9.4.2多重继承78例9-5多重继承程序示例。程序如下:classA():deffoo1(self):print("AAAAA")classB(A):deffoo2(self):print("BBBBB")classC(A):deffoo1(self):print("CCCCC")classD(B,C):passd=D()d.foo1()程序在Python3.x环境下的输出结果是:CCCCC程序在Python2.x环境下的输出结果是:AAAAA例9-5多重继承程序示例。799.4.3多态

多态性多态即多种形态,是指不同的对象收到同一种消息时会产生不同的行为。在程序中消息就是调用函数,不同的行为就是指不同的实现方法,即执行不同的函数。

在Python中很多地方都可以体现多态的特性,例如内置函数len(),len函数不仅可以计算字符串的长度,还可以计算列表、元组等对象中的数据个数,这里在运行时通过参数类型确定其具体的计算过程,正是多态的一种体现。9.4.3多态80例9-7已知y=

,当f(n)=1×2+2×3+3×4+……+n×(n+1)时,求y的值。分析:为了说明面向过程程序设计和面向对象程序设计的区别,分别用面向过程方法和面向对象方法来写程序。9.5面向对象程序设计应用举例例9-7已知y=,当f(n)=1×2+2×3+381例9-8用面向对象方法编写例4-11对应的程序。例9-8用面向对象方法编写例4-11对应的程序。82例9-9某商店销售某一商品,允许销售人员在一定范围内灵活掌握售价(price),现已知当天3名销货员的销售情况为:销货员号(num)

销货件数(quantity)

销货单价(price)101523.51021224.5610310021.5编写程序,计算当日此商品的总销售款sum以及每件商品的平均售价。分析:利用字典来组织数据,以销货员号作为字典关键字,通过关键字遍历字典。例9-9某商店销售某一商品,允许销售人员在一定范围内灵活83配套源代码例9-1程序如下:classCC:x=10#定义属性y=20#定义属性z=30#定义属性defshow(self):#定义方法print((self.x+self.y+self.z)/3)b=CC()#创建实例对象bb.x=30#调用属性xb.show()#调用方法show配套源代码例9-1程序如下:84配套源代码例9-2程序如下:classPerson:__name='brenden'__age=18defgetName(self):returnself.__namedefgetAge(self):returnself.__agep=Person()print(p.getName(),p.getAge())

配套源代码例9-2程序如下:85配套源代码例9-3程序如下:classPerson:def__init__(self,name):self.PersonName=namedefsayHi(self):print('Hello,mynameis{}.'.format(self.PersonName))p=Person('Jasmine')p.sayHi()配套源代码例9-3程序如下:86例9-4程序如下:classUniversityMember:#定义父类def__init__(self,name,age):=nameself.age=ageprint('initUniversityMember:',)deftell(self):print('name:{};age:{}'.format(,self.age))classStudent(UniversityMember):#定义子类Studentdef__init__(self,name,age,marks):UniversityMember.__init__(self,name,age)self.marks=marksprint('initStudent:',)deftell(self):UniversityMember.tell(self)print('marks:',self.marks)classTeacher(UniversityMember):#定义子类Teacherdef__init__(self,name,age,salary):UniversityMember.__init__(self,name,age)#显式调用父类构造方法self.salary=salaryprint('initTeacher:',)deftell(self):UniversityMember.tell(self)print('salary:',

温馨提示

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

评论

0/150

提交评论