资源描述
,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,2019/2/28,#,Python,语言程序设计,刘,卫国,第,9,章,面向对象程序设计,配,源代码,Python语言程序设计刘卫国,1,9.1.1,面向对象的基本概念,1,对象,现实,世界中客观存在的事物称作对象(,object,),任何对象都具有各自的特征(属性)和行为(方法)。,面向对象程序设计,中的对象是现实世界中的客观事物在程序设计中的具体体现,它也具有自己的特征和行为。对象的特征用数据来表示,称为属性(,property,)。对象的行为用,程序代码来,实现,称为对象的方法(,method,)。,总之,任,何对象都是由属性和方法组成的。,9.1,面向对象程序设计概述,9.1.1 面向对象的基本概念9.1 面向对象程序设计概,2,2,类,类,(,class,)是具有相同属性和行为的一组对象的集合,它为属于该类的全部对象提供了统一的抽象描述。任何对象都是某个类的实例(,instance,)。,在,系统中通常有很多相似的对象,它们具有相同名称和类型的属性、响应相同的消息、使用相同的方法。将相似的对象分组形成一个类,每个这样的对象被称为类的一个实例,,一个类中的,所有对象共享一个公共的定义,尽管,它们对属性,所赋予的值不同。,2类,3,3,消息,一个系统由若干个对象组成,各个对象之间通过消息(,message,)相互联系、相互作用。消息是一个对象要求另一个对象实施某项操作的请求。发送者发送消息,在一条消息中,需要包含消息的接收者和要求接收者执行某项操作的请求,接收者通过调用相应的方法响应消息,这个过程被不断地重复,从而驱动整个程序的运行。,3消息,4,4,封装,封装,(,encapsulation,)是指把对象的数据(属性)和操作数据的过程(方法)结合在一起,构成独立的单元,它的内部信息对外界是隐蔽的,不允许外界直接存取对象的属性,只能通过使用类提供的外部接口对该对象实施各项操作,保证了程序中数据的安全性。,类,是数据封装的工具,对象是封装的实现。类的访问控制机制体现在类的成员中可以有公有成员、私有成员和保护成员。对于,外界而言,,只需要知道对象所表现的外部行为,,而不必了解,内部实现细节。,4封装,5,5,继承,继承,(,inheritance,)反映的是类与类之间抽象级别的不同,根据继承与被继承的关系,可分为基类和衍类,基类也称为父类,衍类也称为子类,正如“继承”这个词的字面含义一样,子类将从父类那里获得所有的属性和方法,并且可以对这些获得的属性和方法加以改造,使之具有自己的特点。,5继承,6,6,多态,多态,(,polymorphism,)是指同一名字的方法产生了多个不同的动作行为,也就是不同的对象收到相同的消息时产生不同的行为方式。,将,多态的概念应用于面向对象程序设计,增强了程序对客观世界的模拟性,使得对象程序具有了更好的可读性,更易于理解,而且显著提高了软件的可复用性和可扩充性。,6多态,7,9.1.2,从面向过程到面向对象,面向过程,程序设计就是采用自顶向下的方法,分析出解决问题所需要的步骤,将程序分解为若干个功能模块,每个功能模块用函数来实现。,一,个面向对象的程序一般由类的声明和类的使用两部分组成。程序设计始终围绕“类”展开。通过声明类,构建了程序所要完成的功能,体现了面向对象程序设计的思想。在,Python,中,所有数据类型都可以视为对象,,当,然也可以自定义对象。自定义的对象,数据类型,就是面向对象中的类的概念。,9.1.2 从面向过程到面向对象,8,9.2.1,类的定义,在,Python,中,通过,class,关键字来定义类。定义类的一般格式如下:,class,类名,:,类体,例如定义了一个,Person,类:,class Person:,name=brenden#,定义了一个属性,def printName(self):#,定义了一个方法,print(self.name),9.2,类与对象,9.2.1 类的定义9.2 类与对象,9,9.2.2,对象的创建和使用,在,Python,中,用赋值的方式创建类的实例,一般格式为,:,对象,名,=,类名,(,参数列表,),创建,对象后,可以使用“,.,”运算符,通过实例对象来访问这个类的属性和方法(函数),一般格式为:,对象,名,.,属性名,对象,名,.,函数名,(),例如,语句“,p=Person(),”产生了一个,Person,的,实例对象,此时可以用,p.name,来调用,类的,name,属性。,9.2.2 对象的创建和使用,10,例,9-1,类和对象应用示例。,程序如下:,class CC:,x=10#,定义属性,y=20#,定义属性,z=30#,定义属性,def show(self):#,定义方法,print(self.x+self.y+self.z)/3),b=CC()#,创建实例对象,b,b.x=30#,调用属性,x,b.show()#,调用方法,show,程序输出结果如下,:,26.666666666666668,例9-1 类和对象应用示例。,11,9.3.1,属性和方法的访问控制,1,属性的访问控制,在,Python,中没有像,C+,中,public,和,private,这些关键字来区别公有属性和私有属性,它是以属性命名方式来区分,如果在属性名前面加了两个下划线“,_,”,则表明该属性是私有属性,否则为公有属性。方法也一样,如果在方法名前面加了,2,个下划线,则表示该方法是,私有的,,否则为公有的。,9.3,属性和方法,9.3.1 属性和方法的访问控制9.3 属性和方法,12,例如:,class Person:,name=brenden,age=18,p=Person(),print(p.name,p.age),这里,的,name,和,age,都是公有的,可以直接在类外通过对象名访问,如果想定义成私有的,则需在前面加,2,个下划线“,_,”。,例如:,13,2,方法的访问控制,在,类中可以根据需要定义一些方法,定义方法采用,def,关键字,在类中定义的方法至少会有一个参数,一般以名为“,self,”的变量作为该参数(用其他名称也可以),而且需要作为第一个参数。下面看一个例子。,2方法的访问控制,14,例,9-2,方法的访问控制使用示例。,程序如下:,class Person:,_name=brenden,_age=18,def getName(self):,return self._name,def getAge(self):,return self._age,p=Person(),print(p.getName(),p.getAge(),程序输出结果如下,:,brenden,18,例9-2 方法的访问控制使用示例。,15,9.3.2,类属性和实例属性,1,类属性,顾名思义,,类属性(,class attribute),就是类对象所拥有的属性,它被所有类对象的实例对象所共有,在内存中只存在一个副本。对于公有的类属性,在类外可以通过类对象和实例对象访问。,9.3.2 类属性和实例属性,16,例如:,class Person:,name=brenden#,公有的类属性,_age=18#,私有的类属性,p=Person(),print(p.name)#,正确,但不提倡,print(Person.name)#,正确,print(p._age)#,错误,不能在类外通过实例对象访问私有的类属性,print(Person._age)#,错误,不能在,类外通过,类对象访问私有的类属性,例如:,17,2,实例属性,实例,属性(,instance attribute),是不需要在类中显式定义,而在,_init_,构造函数中定义的,定义时以,self,作为前缀。在其他方法中也可以随意添加新的实例属性,但并不提倡这么做,所有的实例属性最好在,_init_,中给出。实例属性属于实例(对象),只能通过对象名访问。,2实例属性,18,例如:,class Car:,def _init_(self,c):,self.color=c#,定义实例对象属性,def fun(self):,self.length=1.83#,给实例添加属性,但不提倡,s=Car(Red),print(s.color),Red,s.fun(),print(s.length),1.83,例如:,19,9.3.3,类的方法,1,类中,类,中最常用的内置方法就是构造方法和析构方法。,(,1,)构造方法,构造,方法,_init_(self,),在生成对象时调用,可以用来进行一些属性初始化操作,不需要显式去调用,系统会默认去执行。构造方法支持重载,如果用户自己没有重新定义构造方法,系统就自动执行默认的构造方法。看下面的程序。,9.3.3 类的方法,20,例,9-3,构造方法使用示例。,程序如下:,class Person:,def _init_(self,name):,self.PersonName=name,def sayHi(self):,print(Hello,my name is.format(self.PersonName),p=Person(Jasmine),p.sayHi(),程序输出结果如下:,Hello,my name is Jasmine.,例9-3 构造方法使用示例。,21,(,2,)析构方法,析,构方法,_del_(self),在释放对象时调用,支持重载,可以在其中进行一些释放资源的操作,不需要显式调用。下面的例子说明了类的普通成员函数以及构造方法和析构方法的作用,。,(2)析构方法,22,class Test:,def _init_(self):,print(AAAAA),def _del_(self):,print(BBBBB),def myf(self):,print(CCCCC),obj=Test(),AAAAA,obj.myf(),CCCCC,del obj,BBBBB,class Test:,23,2,类方法、实例方法和静态方法,(,1,)类方法,类,方法是类对象所拥有的方法,需要用修饰器“,classmethod,”来标识其为类方法,对于类方法,第一个参数必须是类对象,一般以“,cls,”作为第一个参数。当然可以用其他名称的变量作为其第一个参数,但是大都习惯以“,cls,”作为第一个参数的名字,所以一般用“,cls,”。能够通过实例对象和类对象去访问类方法。,2类方法、实例方法和静态方法,24,例如:,class Person:,place=Changsha,classmethod#,类方法,用,classmethod,来进行修饰,def getPlace(cls):,return cls.place,p=Person(),print(p.getPlace()#,可以用过实例对象引用,Changsha,print(Person.getPlace()#,可以通过,类对象,引用,Changsha,例如:,25,类,方法还有一个用途就是可以对类属性进行修改。例如:,class Person:,place=Changsha,classmethod,def getPlace(cls):,return cls.place,classmethod,def setPlace(cls,place1):,cls.place=place1,p=Person(),p.setPlace(Shanghai)#,修改类属性,print(p.getPlace(),Shanghai,print(Person.getPlace(),Shanghai,类方法还有一个用途就是可以对类属性进行修改。例如:,26,(,2,)实例方法,实例,方法是类中最常定义的成员方法,它至少有一个参数并且必须以实例对象作为其第一个参数,一般以名为,self,的变量作为第一个参数,当然可以以其他名称的变量作为第一个参数。在类外实例方
展开阅读全文