Python语言程序设计(微课版)-课件 -CH09-面向对象程序设计_第1页
Python语言程序设计(微课版)-课件 -CH09-面向对象程序设计_第2页
Python语言程序设计(微课版)-课件 -CH09-面向对象程序设计_第3页
Python语言程序设计(微课版)-课件 -CH09-面向对象程序设计_第4页
Python语言程序设计(微课版)-课件 -CH09-面向对象程序设计_第5页
已阅读5页,还剩47页未读 继续免费阅读

下载本文档

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

文档简介

第9章面向对象程序设计面向过程思想和面向对象思想面向过程,就是面向具体的每一个步骤和过程,把每一个步骤和过程完成,然后由这些功能方法相互调用,实现需求。它主要采用模块分解与功能抽象,自顶向下、分而治之。面向过程思想和面向对象思想例如:吃煎饼果子采用面向过程的思想实现:(1)自己学习摊煎饼的技术(2)买材料鸡蛋、油、葱等等食材(3)开始做(4)吃面向过程思想和面向对象思想面向对象程序设计思想就是将数据以及对数据的操作封装在一起,组成一个相互依存、不可分割的整体,即对象。设计程序过程就是创建对象、使用对象、指挥对象做事情。面向过程思想和面向对象思想例如:吃煎饼果子采用面向对象的思想来实现:(1)找个会摊煎饼的大妈(创建一个摊煎饼大妈的对象)(2)调用其摊煎饼的技能(行为),把钱作为参数传递进去(3)返回给一个煎饼(4)吃6主要内容1.面向对象程序设计思想2.Python类的定义,创建对象,self参数,初始化方法、析构方法。3.类成员与实例属性,类方法、静态方法4.私有属性和私有方法5.继承,单一继承,多重继承6.多态面向对象程序设计面向对象程序设计将程序看做相互协作而又彼此独立的对象的集合,每个对象是一个封装体,具有自己的数据和行为。面向对象程序设计面向大型软件设计,使得软件设计更加灵活,支持代码复用和设计复用代码具有更好的可读性和可扩展性面向对象程序设计对象:每一个相对独立的事物就是对象,一个实体就是一个对象,如一辆汽车、一部电脑、一个人等类:汽车,是具有汽车特性的所有汽车的总称,相当于汽车类。抽象抽象就是抽取事物的本质特征而暂不考虑它们的细节。将同类的对象共有的特征抽取出来,形成这些对象的抽象模型。

汽车类。如轿车、公交车、卡车等,的共性特征,如有发动机、轮子、方向盘,能前进、后退、转弯、刹车等。类在现实生活中,将相同种类的对象归纳为一个类,如汽车类:属性:发动机、颜色、轮圈、电池、续航方法:前进、后退、转弯、刹车、加速、减速对象对象是类的实例化,具有自己的属性和行为例如一辆汽车:属性:发动机:永磁/同步颜色:灰色轮圈:铝合金电池:磷酸铁锂电池续航:405KM行为:前进后退转弯刹车加速减速Python的类和对象Python完全采用面向对象程序设计的思想,支持面向对象的基本功能。Python中一切内容都是面向对象的,如字符串、列表、元组、字典等都是类类和对象类:一种用户自定义的数据类型,是对具有共同属性和行为的事物的抽象描述。属性,是类所特有的,经常定义在类的开头、方法的外面。共同行为是类中的成员函数,称为成员方法。类是对象的抽象,对象是类的实例。类需要先定义,后使用。类的定义类定义的格式class关键字定义类类名约定首字母大写但不是必须的def函数第1个参数必须是self,可以通过对象调用,称为实例方法。class类名:

属性定义

def方法1(self,参数列表):#实例方法

语句块def方法2(self,参数列表):

语句块类和对象【例9.1】Dog类classDog:

defeat(self):#实例方法print("小狗%s爱吃%s"%(,self.fancy))

defhello(self):print("小狗狗欢迎你!")

self.eat()#调用成员函数tom=Dog()#实例化对象="Tom"#属性tom.fancy="骨头"tom.eat();#调用实例方法tom.hello()对象定义类后,可以创建对象。调用对象的属性和实例方法:对象变量=类名()对象变量.成员tom=Dog()#实例化对象="Tom"#属性tom.fancy="骨头"tom.eat();#调用实例成员方法引用tom和jack变量记录的是Dog类对象的地址,指向的是不同的Dog类对象。a、b和tom指向同一个Dog类对象tom=Dog()#实例化对象jack=Dog()a=tomb=tomself参数实例方法的第1个参数必须是self,指的是对象本身。在类的内部通过self访问对象的属性和方法

defeat(self):#实例方法print("小狗%s爱吃%s"%(,self.fancy))初始化方法当使用类名创建对象时,调用初始化方法__init__(),为对象的属性设置初值。在创建对象时,可以传入对应参数def__init__(self,

参数1=默认值1,

参数2=默认值2,.......):

属性1=参数1

属性2=参数2 ......对象名=类名(实参1,实参2,......)初始化方法【例9.2】__init__()方法。classDog:

def__init__(self,x="",y="骨头"):#初始化方法print("初始化方法")=xself.fancy=ydefeat(self):#实例方法print("小狗%s爱吃%s"%(,self.fancy))tom=Dog("Tom","鱼")#实例化对象tom.eat()#调用实例方法jack=Dog("Jack")#实例化对象jack.eat()#调用实例方法初始化方法tom=Dog("Tom","鱼")#实例化对象__init()函数的形参x="Tom",y="鱼",因此="Tom",tom.fancy="鱼"tom=Dog("Jack")#实例化对象__init()函数的形参x="Jack",y="骨头",因此J="Jack",tom.fancy="骨头"析构方法python提供的方法__del__(),当对象被从内存中销毁前,会调用__del__(),用来释放对象占用的资源。当对象的所有引用都不在时,才会被从内存中销毁,此时调用__del__()。def__del__(self):

语句体 ......tom=Dog()#实例化对象a=tomb=tom析构方法【例9.3】__del__()方法。classDog:def__init__(self,x="",y="骨头"):#初始化方法print("初始化方法")=x;self.fancy=y

def__del__(self):#析构方法print("%s对象将被销毁。"%)tom=Dog("Tom","鱼")#实例化对象d1=tom;d2=tom;deltomdeld1;deld2#删除所有引用,调用析构函数__del__()类成员实例属性和实例方法在程序执行时,对象各自拥有自己的实例属性,通过self.访问自己的属性。每一个对象都有自己独立的内存空间,保存各自不同的属性。多个对象的实例方法,在内存中只有一份,在调用方法时,需要把对象的引用传递到方法内部。="Tom"#属性tom.fancy="骨头"tom.eat();

=x;self.fancy=yself.eat()类属性类属性类属性就是在类中定义的属性,通常用来记录与这个类相关的特征,不会记录具体对象的特征,访问类属性可以在类定义的外边,增加类属性类名.属性名=值类名.属性名类属性【例9.4】类属性classDog:

count=0fancy="骨头"#类属性def__init__(self,x=""):#初始化方法=x

Dog.count+=1#类属性dog1=Dog("Tom")#实例化对象dog2=Dog("Jack")print(Dog.fancy,Dog.count)dog1.fancy="鱼"#实例属性print(dog1.fancy,Dog.fancy)#实例属性与类属性不同Dog.Owner="Mallinda"#创建类属性print("%s有%d只小狗"%(Dog.Owner,Dog.count))类方法类方法就是针对类定义的方法在类方法内部可以直接访问类属性或者调用类方法,类方法不能调用实例化对象的属性和方法。类方法也可以被对象调用@classmethoddef类方法名(cls):

语句块类方法【例9.5】类方法classDog:count=0fancy="骨头"#类属性def__init__(self,x=""):#初始化方法=x;Dog.count+=1@classmethod#类方法defeat(cls):print("小狗爱吃%s"%cls.fancy)@classmethoddefshowCount(cls):print("共有%d只小狗"%cls.count)

Dog.eat()#调用类方法dog1=Dog("Tom")#实例化对象dog2=Dog("Jack")dog3=Dog("Kimi")Dog.showCount()#类调用类方法dog1.showCount()#对象调用类方法静态方法静态方法在类中封装的方法,既不需要访问实例属性或方法,也不需要访问类属性或方法,此时可以封装成静态方法。静态方法可以被类和实例调用@staticmethoddef静态方法名():

语句块静态方法【例9.6】静态方法classDog:count=0;fancy="骨头"#类属性def__init__(self,x="",y=""):#初始化方法=x;self.drinky=y;Dog.count+=1

@staticmethoddefshowHelp():#静态方法print("=====关于小狗的传说=====")

@classmethoddefeat(cls):#类方法print("小狗爱吃%s!"%cls.fancy)

defdrink(self):#实例方法print("小狗爱喝%s!"%self.drinky)Dog.showHelp()Dog.eat()dog1=Dog("Tom","水")dog1.drink()dog1.showHelp()私有属性和私有方法私有属性和私有方法:对象的某些属性和方法可能只希望对象内部访问,不希望被外部访问。定义私有属性和私有方法:python在定义属性和方法时,在名称前加两个下划线。私有属性和私有方法,在类外部不能直接访问,需要调用对象的公有成员访问。私有属性和私有方法,可以通过Python的特殊方法访问。私有属性和私有方法【例9.7】类中定义私有成员classDog:def__init__(self,x="",y=""):self.__name=x#私有属性self.__fancy=y

def__eat(self):#私有方法print("小狗%s爱吃%s!"%(self.__name,self.__fancy))defshowDog(self):print("Hereisadog!")

self.__eat()#访问私有方法aDog=Dog("Tom","骨头")aDog.showDog()aDog.__eat()#私有方法不能访问print(aDog.__name,aDog.__fancy)#私有属性不能外部访问私有属性和私有方法可以通过特殊方式访问私有成员classDog:def__init__(self,x="",y=""):self.__name=x#私有属性self.__fancy=y

def__eat(self):#私有方法print("小狗%s爱吃%s!"%(self.__name,self.__fancy))defshowDog(self):print("Hereisadog!")

self.__eat()#访问私有方法aDog=Dog("Tom","骨头")aDog.showDog()aDog._Dog__eat()#访问私有方法print(aDog._Dog__name,aDog._Dog__fancy)#访问私有属性_类名__私有成员名私有成员私有成员是为了封装和保密而设置,在日常开发中不推荐通过特殊方法访问私有成员。属性名和方法名的特殊含义:_xxx:保护成员,不能用”frommoduleimport”导入,只有类和子类能访问。__xxx__:系统定义的特殊成员__xxx:私有成员,只有类自己能访问,子类也不能访问。可以通过“对象名._类名__xxx”访问。面向对象的基本特性封装继承多态基本特性封装在面向对象程序中,将数据(属性)和操作数据的方法都放在一个对象中,组成一个相互依存、不可分割的整体,就是封装。封装隐藏了对象的内部的细节,不允许外部直接操作内部数据,避免误存取的发生,保证数据的安全。继承继承,就是新类从已有类那里得到已有的特性。已有的类称为父类或者基类,新类称为子类或者派生类。子类可以沿用父类的某些特征,并根据自己的需要添加新的属性和方法。`继承包括:单一继承、多重继承继承是面对象程序设计的重要特性之一,继承可以实现软件复用,从而大大减少开发工作量。继承单一继承单一继承,子类只能有一个父类,但父类可以拥有多个子类。继承具有传递性。class类名(父类名):

属性定义

方法定义Dog类是Animal类的子类(派生类)Animal类是Dog类的父类(基类),Dog类从Animal类继承(派生)单一继承子类会继承父类的属性和方法。【例9.8】单一继承classAnimal:#父类defeat(self):print("吃")defdrink(self):print("喝")defrun(self):print("跑")defsleep(self):print("睡")classDog(Animal):#子类

#子类拥有父类的eat、drink、run、sleep方法defbark(self):print("汪汪叫")classCat(Animal):#子类defcatch(self):print("抓老鼠")adog=Dog()adog.eat()adog.run()adog.bark()acat=Cat()acat.eat()acat.catch()单一继承方法重写:子类可以修改或者重写父类的方法。覆盖父类:在子类中重新编写一个父类方法同名的方法,之后子类对象调用的就是重写后的方法了。扩展父类方法:子类中重写父类方法时,使用“super().方法名”调用父类方法,执行父类方法,代码其他位置实现子类的需求。super()就是父类创建的对象,用于调用父类方法。重写父类方法【例9.9】重写父类方法classAnimal:defeat(self):print("吃")defdrink(self):print("喝")defrun(self):print("跑")defsleep(self):print("睡")classDog(Animal):

#子类拥有父类的方法defbark(self):print("汪汪叫")classXiaotianquan(Dog):deffly(self):print("我会飞")

defeat(self):#重写父类方法print("哮天犬爱吃骨头")

defbark(self):#重写父类方法print("我的叫声很特别")

super().bark()#调用父类方法print("啦啦啦啦")xtq=Xiaotianquan()xtq.eat()xtq.fly()xtq.bark()父类的私有属性和私有方法子类不能在自己的方法内部直接访问父类的私有属性和私有方法但是,子类可以通过父类的公有方法间接访问父类的私有属性或私有方法。私有属性、方法是对象的隐私,不对外公开,外界以及子类都不能直接访问私有属性、方法通常用于做一些内部的事情父类的私有属性和私有方法【例9.10】私有属性和私有方法classAnimal:def__init__(self):

self.__name="Tom"#私有属性self.fancy="骨头"#共有属性

def__eat(self):#私有方法print("吃")deftest(self):print(self.__name,self.fancy)

self.__eat()classDog(Animal):defdemo(self):

self.test()#父类方法

#self.__eat()

#不能访问父类私有方法#print(self.__name)

#不能访问父类私有属性d1=Dog()d1.demo()d1.test()#d1.__eat()#不能访问父类私有方法多重继承多重继承,子类可以拥有多个父类,并且继承所有父类的属性和方法。class子类名(父类名1,父类名2...)

属性定义

方法定义多重继承【例9.11】多重继承classA:deftest(self):print("test方法")classB:defdemo(self):print("demo方法")classC(A,B):"""多继承可以让子类对象,同时具有多个父类的属性和方法"""pass#创建子类对象c=C()c.test()c.demo()多重继承如果不同的父类中存在同名的方法,子类对象在调用方法时,会调用哪一个父类中的方法呢?Python中针对类提供了一个内置属性__mro__,可以查看方法的搜索顺序。如果找到方法,则直接执行,不再搜索。如果没有找到,就查找下一个类,如果找到最后一个类还没有找到方法,程序报错。多重继承其实很容易导致代码混乱,请尽量避免使用多重继承。多重继承【例9.11B】多重继承classA:deftest(self):print("test方法1")classB:deftest(self):print("test方法2")

温馨提示

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

评论

0/150

提交评论