【文档说明】PT0144_爱上Python(13)_面向对象编程基础-----计算机学习实战课件.pptx,共(44)页,178.325 KB,由小橙橙上传
转载请保留链接:https://www.ichengzhen.cn/view-76380.html
以下为本文档部分文字说明:
爱上python(13)面向对象编程基础•面向对象编程是一种程序设计范式•把程序看作不同对象的相互调用•对现实世界建立对象模型什么是面向对象编程面向对象编程的基本思想类和实例:类用于定义抽象类型实例是根据
类的定义创建出来的一个个具体的‘对象’人类classPerson(object):passxiaoming=Person()小明小红实例xiaohong=Person()面向对象编程:数据封装classPerson(object):def__init__
(self,name):self.name=namep1=Person('XiaoMing')p2=Person('XiaoHong')Python之定义类并创建实例类通过class关键字定义,以Person为例:类名以大写字母开头,然后是(object),表示
该类是从哪个类继承下来的。创建实例使用类名+(),类似函数调用的形式创建xiaoming=Person()classPerson(object):passclassPerson():passclassPerson:passxiaoming=Pers
on()xiaohong=Person()printxiaomingprintxiaohongprintxiaoming==xiaohong<__main__.Personinstanceat0x02813AF8><_
_main__.Personinstanceat0x02813B20>False结果:P11-2Python中创建实例属性如何让每个实例拥有各自不同的属性?由于Python是动态语言,对每个实例,都可以直接给他们的属性赋值。xiaoming=P
erson()xiaoming.name='XiaoMing'xiaoming.gender='Male'xiaoming.birth='1990-1-1'xiaohong=Person()xiaohong.name='XiaoHong'xiaohong.school='No.1HighS
chool'xiaohong.grade=2实例的属性可以像普通变量一样进行操作:xiaohong.grade=xiaohong.grade+1Python中初始化实例属性•虽然我们可以自由地给一个实例绑定各种属性,但是,现实世界中,一种类型的
实例应该拥有相同名字的属性。例如,Person类应该在创建的时候就拥有name、gender和birth属性,怎么办?•在定义Person类时,可以为Person类添加一个特殊的__init__()方法,当创建实例时,__init__()方法被自动调用,我们就能在此为每个实
例都统一加上以下属性:classPerson(object):def__init__(self,name,gender,birth):self.name=nameself.gender=genderself.birth=birth__init__()方法的第一个参数必须是self,后续
的参数可以自由指定。>>>相应地,创建实例时,就必须要提供除self以外的参数:xiaoming=Person('XiaoMing','Male','1990-1-1')>>>有了__init__()方法,每个Person
实例在创建时,都会有name、gender和birth这3个属性,并且,被赋予不同的属性值,访问属性使用.操作符:printxiaoming.name输出:XiaoMingclassPerson(object):def__ini
t__(self,name,gender,birth):self.name=nameself.gender=genderself.birth=birthxiaoming=Person('XiaoMing','Male','1990-1-1')p
rintxiaoming.nameP11-4注意:__init__(self)参数classPerson(object):def__init__(name,gender,birth):passxiaoming=Person('XiaoMing','Male',
'1990-1-1')P11-5定义Person类的__init__方法,还可以接受任意关键字参数,并把它们都作为属性赋值给实例*args是无关键字参数,用于元组,**kw是关键字参数,用于字典一般可以
使用self.name=‘xxx’设置一个属性还可以通过setattr(self,’name’,’xxx’)设置属性•内置函数setattr(object,name,value)•object:对象name:字符串或对象属性value:属性值•set
attr(object,name,value)==>object.name=valueclassPerson(object):def__init__(self,name,gender,birth,**k
w):self.name=nameself.gender=genderself.birth=birthfork,vinkw.iteritems():setattr(self,k,v)xiaoming=Person('XiaoMing','Male','1990-1-1',
job='Student')printxiaoming.nameprintxiaoming.jobP11-6Python中访问限制Python对属性权限的控制是通过属性名来实现的,如果一个属性由双下划线开头(__),该属性就无法被外部访问。
例:self.__name=name可见,只有双下划线开头的‘__job’不能直接被外部访问classPerson(object):def__init__(self,name):self.name=nameself._title='Mr'self
.__job='Student'p=Person('Bob')printp.nameprintp._titleprintp.__jobP11-7•如果一个属性以"__xxx__"的形式定义,那它又可以被外部访问了,以"__xxx__"定义的
属性在Python的类中被称为特殊属性•以单下划线开头的属性"_xxx"虽然也可以被外部访问,但是,按照习惯,他们不应该被外部访问。classPerson(object):def__init__(self,n
ame,score):self.name=nameself.__score=scorep=Person('Bob',59)printp.nameprintp.__scoreP11-8Python中创建类属性•类是模板,而实例则是根据类创建的对象。•实例属性每个实例各自拥有,互
相独立,而类属性有且只有一份。定义类属性可以直接在class中定义:classPerson(object):address='Earth'def__init__(self,name):self.name=name访问类属性不需要创建实例,可以直接访
问:printPerson.addressP11-9对一个实例调用类的属性也是可以访问的,所有实例都可以访问到它所属的类的属性:p1=Person('Bob')p2=Person('Alice')printp1.addressprintp2
.address由于Python是动态语言,类属性也是可以动态添加和修改的:Person.address='China'printp1.addressprintp2.address因为类属性只有一份,所以,当Person类的address改变时,所有实例访问到的类属性都改变了
。classPerson(object):count=0def__init__(self,name):self.name=namePerson.count=Person.count+1p1=Person('Bob')printPerson.countp2=Person('Alice')pr
intPerson.countP11-10Python中类属性和实例属性名字冲突怎么办?修改类属性会导致所有实例访问到的类属性全部都受影响,但是,如果在实例变量上修改类属性会发生什么问题呢?classPerson(object):address='Ea
rth'def__init__(self,name):self.name=namep1=Person('Bob')p2=Person('Alice')print'Person.address='+Person.address
p1.address='China'print'p1.address='+p1.addressprint'Person.address='+Person.addressprint'p2.address='+p2.ad
dressP11-11当实例属性和类属性重名时,实例属性优先级高,它将屏蔽掉对类属性的访问。delp1.addressprintp1.address千万不要在实例上修改类属性,它实际上并没有修改类属性,而是
给实例绑定了一个实例属性。Python中定义实例方法•一个实例的私有属性就是以__开头的属性,无法被外部访问,那这些属性定义有什么用?•实例的方法就是在类中定义的函数,它的第一个参数永远是self,指向调用该方法的实例本身,其他参数和
一个普通函数是完全一样的classPerson(object):def__init__(self,name):self.__name=namedefget_name(self):returnself.__nameget_name(self)就是一个实例方法,它的第一个参
数是self。__init__(self,name)其实也可看做是一个特殊的实例方法。P11-12p1=Person('Bob')printp1.get_name()调用实例方法必须在实例上调用:在实例方法内部,可以访问所有实
例属性,这样,如果外部需要访问私有属性,可以通过方法调用获得,Python中方法也是属性classPerson(object):def__init__(self,name,score):self.name=nameself.score=scoredef
get_grade(self):return'A'p1=Person('Bob',90)printp1.get_gradeprintp1.get_grade()P11-13•p1.get_grade返回的是一个函数对象,但这个函数是一个绑定到实例的函数,p1.get_gr
ade()才是方法调用。•因为方法也是一个属性,所以,它也可以动态地添加到实例上,只是需要用types.MethodType()把一个函数变为一个方法:importtypesdeffn_get_grade(self):ifs
elf.score>=80:return'A'ifself.score>=60:return'B'return'C'classPerson(object):def__init__(self,name,score):self.name=namese
lf.score=scorep1=Person('Bob',90)p1.get_grade=types.MethodType(fn_get_grade,p1,Person)printp1.get_grade()P11-14p2=Person('Alice',65)p
rintp2.get_grade()Python中定义类方法和属性相似,方法也分实例方法和类方法在class中定义的全部是实例方法,实例方法第一个参数self是实例本身。classPerson(object):count=0@classme
thoddefhow_many(cls):returncls.countdef__init__(self,name):self.name=namePerson.count=Person.count+1pri
ntPerson.how_many()p1=Person('Bob')printPerson.how_many()P11-15•通过标记一个@classmethod,该方法将绑定到Person类上,而非类的实例。类方法的第一个
参数将传入类本身,通常将参数名命名为cls,上面的cls.count实际上相当于Person.count。•因为是在类上调用,而非实例上调用,因此类方法无法获得任何实例变量,只能获得类的引用。classPerson(object):__count=
0@classmethoddefhow_many(cls):returncls.__countdef__init__(self,name):self.name=namePerson.__count=Person.__count+1prin
tPerson.how_many()p1=Person('Bob')printPerson.how_many()P11-16私有属性不可以直接被调用,但可以通过方法来调用,包括类方法和实例方法,所以如果要想调用出私有属性的值,定义方法就可以啦P11-17classPerson(object
):address='Earth'__count=0__language='Chinese'@classmethoddefhow_many(cls):returncls.__countdef__init__(self,name,score,gender):s
elf.score=scoreself.__name=nameself.__gender=genderPerson.__count=Person.__count+1defget_name(self):return
self.__namep1=Person('Bob',90,'Male')printPerson.how_many()p2=Person('Alice',65,'Female')printPerson.how_many()printp1.addressp1.a
ddress='China'printp1.addressprintp2.addressprintp1.scoreprintp1.get_name()printp1.genderprintp1.Language