PT0144_爱上Python(13)_面向对象编程基础-----计算机学习实战ppt课件

上传人:文**** 文档编号:244558443 上传时间:2024-10-05 格式:PPTX 页数:44 大小:178.33KB
返回 下载 相关 举报
PT0144_爱上Python(13)_面向对象编程基础-----计算机学习实战ppt课件_第1页
第1页 / 共44页
PT0144_爱上Python(13)_面向对象编程基础-----计算机学习实战ppt课件_第2页
第2页 / 共44页
PT0144_爱上Python(13)_面向对象编程基础-----计算机学习实战ppt课件_第3页
第3页 / 共44页
点击查看更多>>
资源描述
,爱上,python,(,13,)面向对象编程基础,面向对象编程是一种程序设计范式,把程序看作不同对象的相互调用,对现实世界建立对象模型,什么是面向对象编程,面向对象编程的基本思想,类和实例:,类用于定义抽象类型,实例,是,根据类的定义创建出来的一个个具体的对象,人 类,class Person(object):,pass,xiaoming=Person(),小明 小红 实例,xiaohong=Person(),面向对象编程:数据封装,class,Person,(,object,):,def,_init_,(,self,name):,self,.name=name p1=Person(,Xiao Ming,)p2=Person(,Xiao Hong,),Python,之定义类并创建实例,类通过,class,关键字定义,以,Person,为例:,类名以大写字母开头,然后是(,object,),表示该类是从哪个类继承下来的。,创建实例使用类名,+,(),类似函数调用的形式创建,xiaoming=Person(),class,Person,(,object,):,pass,class,Person,():,pass,class,Person,:,pass,xiaoming=Person()xiaohong=Person(),print,xiaoming,print,xiaohong,print,xiaoming=xiaohong,False,结果:,P11-2,Python,中创建实例属性,如何让每个实例拥有各自不同的属性?,由于,Python,是动态语言,对每个实例,都可以直接给他们的属性赋值。,xiaoming=Person()xiaoming.name=,Xiao Ming,xiaoming.gender=,Male,xiaoming.birth=,1990-1-1,xiaohong=Person()xiaohong.name=,Xiao Hong,xiaohong.school=,No.1 High School,xiaohong.grade=,2,实例的属性可以像普通变量一样进行操作:,xiaohong.grade=xiaohong.grade+,1,Python,中初始化实例属性,虽然我们可以自由地给一个实例绑定各种属性,但是,现实世界中,一种类型的实例应该拥有相同名字的属性。例如,,Person,类,应该在创建的时候就拥有,name,、,gender,和,birth,属性,怎么办,?,在定义,Person,类时,可以为,Person,类添加一个特殊的,_init_(),方法,当创建实例时,,_init_(),方法被自动调用,我们就能在此为每个实例都统一加上以下属性:,class,Person,(,object,):,def,_init_,(,self,name,gender,birth):,self,.name=name,self,.gender=gender,self,.birth=birth,_init_(),方法的第一个参数必须是,self,,后续的参数可以自由指定,。,相应,地,创建实例时,就必须要提供除,self,以外的参数,:,xiaoming=Person(,Xiao Ming,Male,1990-1-1,),有了,_init_(),方法,每个,Person,实例在创建时,都会有,name,、,gender,和,birth,这,3,个属性,并且,被赋予不同的属性值,访问属性使用,.,操作符,:,print,xiaoming.name,输出:,Xiao Ming,class,Person,(,object,):,def,_init_,(,self,name,gender,birth):,self,.name=name,self,.gender=gender,self,.birth=birthxiaoming=Person(,Xiao Ming,Male,1990-1-1,),print,xiaoming.name,P11-4,注意:,_init_(self),参数,class,Person,(,object,):,def,_init_,(,name,gender,birth,):,pass,xiaoming=Person(,Xiao Ming,Male,1990-1-1,),P11-5,定义,Person,类的,_init_,方法,还可以接受任意关键字参数,并把它们都作为属性赋值给实例,*,args,是无关键字参数,用于元组,*,kw,是关键字参数,用于字典,一般,可以使用,self.name=xxx,设置一个属性,还,可以通过,setattr,(,self,name,xxx,),设置,属性,内置函数,setattr,(,object,name,value,),object:,对象,name:,字符串或对象属性,value:,属性值,s,etattr(object,name,value),=object.name=value,class,Person,(,object,):,def,_init_,(,self,name,gender,birth,*kw):,self,.name=name,self,.gender=gender,self,.birth=birth,for,k,v,in,kw.iteritems():,setattr,(,self,k,v)xiaoming=Person(,Xiao Ming,Male,1990-1-1,job,=,Student,),print,xiaoming.name,print,xiaoming.job,P11-6,Python,中访问限制,Python,对属性权限的控制是通过属性名来实现的,如果一个属性由双下划线开头,(_),,该属性就无法被外部访问,。,例:,self._,name=name,可见,只有双下划线开头的,_job,不能直接被外部访问,class,Person,(,object,):,def,_init_,(,self,name):,self,.name=name,self,._title=,Mr,self,._job=,Student,p=Person(,Bob,),print,p.name,print,p._title,print,p._job,P11-7,如果一个属性以,_xxx_,的形式定义,那它又可以被外部访问了,以,_xxx_,定义的属性在,Python,的类中被称为特殊,属性,以单下划线开头的属性,_xxx,虽然也可以被外部访问,但是,按照习惯,他们不应该被外部访问。,class,Person,(,object,):,def,_init_,(,self,name,score):,self,.name=name,self,._score=scorep=Person(,Bob,59,),print,p.name,print,p._score,P11-8,Python,中创建类属性,类是模板,而实例则是根据类创建的对象,。,实例属性每个实例各自拥有,互相独立,而类属性有且只有一份。,定义类属性可以直接在,class,中定义:,class,Person,(,object,):address=,Earth,def,_init_,(,self,name):,self,.name=name,访问类属性不需要创建实例,,可以,直接访问:,print,Person.address,P11-9,对一个实例调用类的属性也是可以访问的,所有实例都可以访问到它所属的类的属性:,p1=Person(,Bob,)p2=Person(,Alice,),print,p1.address,print,p2.address,由于,Python,是动态语言,类属性也是可以动态添加和修改的:,Person.address=,China,print,p1.address,print,p2.address,因为类属性只有一份,所以,当,Person,类的,address,改变时,所有实例访问到的类属性都改变了。,class,Person,(,object,):count=,0,def,_init_,(,self,name):,self,.name=name Person.count=Person.count+,1,p1=Person(,Bob,),print,Person.countp2=Person(,Alice,),print,Person.count,P11-10,Python,中,类,属性和实例属性名字冲突怎么办?,修改,类属性会导致所有实例访问到的类属性全部都受影响,但是,如果在实例变量上修改类属性会发生什么问题呢?,class,Person,(,object,):address=,Earth,def,_init_,(,self,name):,self,.name=namep1=Person(,Bob,)p2=Person(,Alice,),print,Person.address=,+Person.addressp1.address=,China,print,p1.address=,+p1.address,print,Person.address=,+Person.address,print,p2.address=,+p2.address,P11-11,当,实例属性和类属性重名时,实例属性优先级高,它将屏蔽掉对类属性的访问,。,del,p1.address,print,p1.address,千万不要在实例上修改类属性,它实际上并没有修改类属性,而是给实例绑定了一个实例属性。,Python,中定义实例方法,一个实例的私有属性就是以,_,开头的属性,无法被外部访问,那这些属性定义有什么用,?,实例,的方法,就是在类中定义的函数,它的第一个参数永远是,self,,指向调用该方法的实例本身,其他参数和一个普通函数是完全一样,的,class,Person,(,object,):,def,_init_,(,self,name):,self,._name=name,def,get_name,(,self,):,return,self,._name,get_name(self,),就是一个实例方法,它的第一个参数是,self,。,_,_init_(self,name),其实也可看做是一个特殊的实例方法,。,P11-12,p1=Person(,Bob,),print,p1.get_name(),调用实例方法必须在实例上调用:,在实例方法内部,可以访问所有实例属性,这样,如果外部需要访问私有属性,可以通过方法调用获得,,Python,中,方法也是属性,class,Person,(,object,):,def,_init_,(,self,name,score):,self,.name=name,self,.score=score,def,get_grade,(,self,):,return,A,p1=Person(,Bob,90,),print,p1.get_grade,print,p1.get_grade(),P11-13,p1.get_grade,返回的是一个函数对象,但这个函数是一个绑定到实例的函数,,p1.get_grade(),才是方法调用,。,因为方法也是一个属性,所以,它也可以动态地添加到实例上,只是需要用,types.MethodType(),把一个函数变为一个方法:,import,types,def,fn_get_grade,(self):,if,self.score=,80,:,return,A,if,self.score=,60,:,return,B,return,C,class,Person,(,object,):,def,_init_,(,self,name,score):,self,.name=name,self,.score=scorep1=Per
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 教学培训


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!