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

上传人(卖家):晟晟文业 文档编号:4290563 上传时间:2022-11-26 格式:PPTX 页数:44 大小:168.59KB
下载 相关 举报
PT0144-爱上Python(13)-面向对象编程基础-计算机学习实战课件.pptx_第1页
第1页 / 共44页
PT0144-爱上Python(13)-面向对象编程基础-计算机学习实战课件.pptx_第2页
第2页 / 共44页
PT0144-爱上Python(13)-面向对象编程基础-计算机学习实战课件.pptx_第3页
第3页 / 共44页
PT0144-爱上Python(13)-面向对象编程基础-计算机学习实战课件.pptx_第4页
第4页 / 共44页
PT0144-爱上Python(13)-面向对象编程基础-计算机学习实战课件.pptx_第5页
第5页 / 共44页
点击查看更多>>
资源描述

1、爱上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)

2、Python 之定义类并创建实例类通过class关键字定义,以Person为例:类名以大写字母开头,然后是(object),表示该类是从哪个类继承下来的。创建实例使用类名+(),类似函数调用的形式创建xiaoming=Person()class Person(object):passclass Person():passclass Person:passxiaoming=Person()xiaohong=Person()print xiaoming print xiaohongprint xiaoming=xiaohongFalse结果:P11-2Python 中创建实例属性如何让每个实例拥有

3、各自不同的属性?由于Python是动态语言,对每个实例,都可以直接给他们的属性赋值。xiaoming=Person()xiaoming.name=Xiao Mingxiaoming.gender=Malexiaoming.birth=1990-1-1xiaohong=Person()xiaohong.name=Xiao Hongxiaohong.school=No.1 High Schoolxiaohong.grade=2实例的属性可以像普通变量一样进行操作:xiaohong.grade=xiaohong.grade+1Python 中初始化实例属性虽然我们可以自由地给一个实例绑定各种属性,但

4、是,现实世界中,一种类型的实例应该拥有相同名字的属性。例如,PersonPerson类类应该在创建的时候就拥有 namename、gendergender 和 birthbirth 属性,怎么办?在定义 Person 类时,可以为Person类添加一个特殊的_init_()_init_()方法,当创建实例时,_init_()_init_()方法被自动调用,我们就能在此为每个实例都统一加上以下属性:class Person(object):def _init_(self,name,gender,birth):self.name=name self.gender=gender self.birth

5、=birth_init_()方法的第一个参数必须是self,后续的参数可以自由指定。相应地,创建实例时,就必须要提供除 self以外的参数:xiaoming=Person(Xiao Ming,Male,1990-1-1)有了_init_()方法,每个Person实例在创建时,都会有 name、gender和 birth这3个属性,并且,被赋予不同的属性值,访问属性使用.操作符:print xiaoming.name输出:Xiao Mingclass Person(object):def _init_(self,name,gender,birth):self.name=name self.gen

6、der=gender self.birth=birthxiaoming=Person(Xiao Ming,Male,1990-1-1)print xiaoming.nameP11-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.na

7、me=xxx设置一个属性还可以通过setattr(self,name,xxx)设置属性内置函数setattr(object,name,value)object:对象 name:字符串或对象属性 value:属性值setattr(object,name,value)=object.name=valueclass 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,

8、k,v)xiaoming=Person(Xiao Ming,Male,1990-1-1,job=Student)print xiaoming.nameprint xiaoming.jobP11-6Python 中访问限制Python对属性权限的控制是通过属性名来实现的,如果一个属性由双下划线开头(_),该属性就无法被外部访问。例:self._name=name可见,只有双下划线开头的_job不能直接被外部访问class Person(object):def _init_(self,name):self.name=name self._title=Mr self._job=Studentp=Pe

9、rson(Bob)print p.nameprint p._titleprint p._jobP11-7如果一个属性以_xxx_的形式定义,那它又可以被外部访问了,以_xxx_定义的属性在Python的类中被称为特殊属性以单下划线开头的属性_xxx虽然也可以被外部访问,但是,按照习惯,他们不应该被外部访问。class Person(object):def _init_(self,name,score):self.name=name self._score=scorep=Person(Bob,59)print p.nameprint p._scoreP11-8Python 中创建类属性类是模板,

10、而实例则是根据类创建的对象。实例属性每个实例各自拥有,互相独立,而类属性有且只有一份。定义类属性可以直接在class中定义:class Person(object):address=Earth def _init_(self,name):self.name=name访问类属性不需要创建实例,可以直接访问:print Person.addressP11-9对一个实例调用类的属性也是可以访问的,所有实例都可以访问到它所属的类的属性:p1=Person(Bob)p2=Person(Alice)print p1.addressprint p2.address由于Python是动态语言,类属性也是可以动

11、态添加和修改的:Person.address=Chinaprint p1.addressprint 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.countP11-10Python 中类属性和实例属性名字冲突怎么办?修

12、改类属性会导致所有实例访问到的类属性全部都受影响,但是,如果在实例变量上修改类属性会发生什么问题呢?class Person(object):address=Earth def _init_(self,name):self.name=namep1=Person(Bob)p2=Person(Alice)print Person.address=+Person.addressp1.address=Chinaprint p1.address=+p1.addressprint Person.address=+Person.addressprint p2.address=+p2.addressP11-1

13、1 当实例属性和类属性重名时,实例属性优先级高,它将屏蔽掉对类属性的访问。del p1.addressprint p1.address千万不要在实例上修改类属性,它实际上并没有修改类属性,而是给实例绑定了一个实例属性。Python 中定义实例方法一个实例的私有属性就是以_开头的属性,无法被外部访问,那这些属性定义有什么用?实例实例的方法的方法就是在类中定义的函数,它的第一个参数永远是 self,指向调用该方法的实例本身,其他参数和一个普通函数是完全一样的class Person(object):def _init_(self,name):self._name=name def get_name

14、(self):return self._name get_name(self get_name(self)就是一个实例方法,它的第一个参数是self。_init_(self,name)_init_(self,name)其实也可看做是一个特殊的实例方法。P11-12p1=Person(Bob)print p1.get_name()调用实例方法必须在实例上调用:在实例方法内部,可以访问所有实例属性,这样,如果外部需要访问私有属性,可以通过方法调用获得,Python 中方法也是属性class Person(object):def _init_(self,name,score):self.name=n

15、ame self.score=score def get_grade(self):return Ap1=Person(Bob,90)print p1.get_gradeprint p1.get_grade()P11-13p1.get_grade返回的是一个函数对象,但这个函数是一个绑定到实例的函数,p1.get_grade()才是方法调用。因为方法也是一个属性,所以,它也可以动态地添加到实例上,只是需要用 types.MethodType()把一个函数变为一个方法:import typesdef fn_get_grade(self):if self.score=80:return A if s

16、elf.score=60:return B return Cclass Person(object):def _init_(self,name,score):self.name=name self.score=scorep1=Person(Bob,90)p1.get_grade=types.MethodType(fn_get_grade,p1,Person)print p1.get_grade()P11-14p2=Person(Alice,65)print p2.get_grade()Python 中定义类方法和属性相似,方法也分实例方法和类方法在class中定义的全部是实例方法,实例方法第一

17、个参数 self是实例本身。class Person(object):count=0 classmethod def how_many(cls):return cls.count def _init_(self,name):self.name=name Person.count=Person.count+1print Person.how_many()p1=Person(Bob)print Person.how_many()P11-15通过标记一个 classmethod,该方法将绑定到 PersonPerson 类上,而非类的实例。类方法的第一个参数将传入类本身,通常将参数名命名为 clsc

18、ls,上面的 cls.countcls.count 实际上相当于 Person.countPerson.count。因为是在类上调用,而非实例上调用,因此类方法无法获得任何实例变量,只能获得类的引用。class Person(object):_count=0 classmethod def how_many(cls):return cls._count def _init_(self,name):self.name=name Person._count=Person._count+1print Person.how_many()p1=Person(Bob)print Person.how_ma

19、ny()P11-16 私有属性不可以直接被调用,但可以通过方法来调用,包括类方法和实例方法,所以如果要想调用出私有属性的值,定义方法就可以啦P11-17class Person(object):address=Earth _count=0 _language=Chinese classmethod def how_many(cls):return cls._count def _init_(self,name,score,gender):self.score=score self._name=name self._gender=gender Person._count=Person._count+1 def get_name(self):return self._namep1=Person(Bob,90,Male)print Person.how_many()p2=Person(Alice,65,Female)print Person.how_many()print p1.addressp1.address=Chinaprint p1.addressprint p2.addressprint p1.scoreprint p1.get_name()print p1.genderprint p1.Language

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 办公、行业 > 各类PPT课件(模板)
版权提示 | 免责声明

1,本文(PT0144-爱上Python(13)-面向对象编程基础-计算机学习实战课件.pptx)为本站会员(晟晟文业)主动上传,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。
2,用户下载本文档,所消耗的文币(积分)将全额增加到上传者的账号。
3, 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(发送邮件至3464097650@qq.com或直接QQ联系客服),我们立即给予删除!


侵权处理QQ:3464097650--上传资料QQ:3464097650

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


163文库-Www.163Wenku.Com |网站地图|