第4章 类与对象_第1页
第4章 类与对象_第2页
第4章 类与对象_第3页
第4章 类与对象_第4页
第4章 类与对象_第5页
已阅读5页,还剩40页未读 继续免费阅读

下载本文档

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

文档简介

第4章类与对象主讲人:***13-10月-23Python数据分析与数据挖掘目录contents面向对象0102类和对象03类定义与使用04属性方法05继承0706运算符重载面向对象014.1面向对象面向对象定义:是针对面向过程这一思想的不足所提出的,是指以“对象”为核心反映现实中的事物,并以对象之间的消息传递描述事物之间的关系,从而构建程序。实施过程:首先依据对现实需求的分析抽象提取出多个对象,然后为其增加相应的属性和功能,从而达到让对象实现相关的动作。应用:数据库系统、交互式界面、应用结构、应用平台、分布式系统、网络管理结构、CAD技术、人工智能等多个领域。优点:较于面向过程,更适用于复杂化的程序,且易维护、易复用、易扩展,思维逻辑更加贴近于现实生活,更容易解决大型的复杂的业务逻辑。面向过程定义:它是以解决问题的过程为核心进行编程,是一种自顶向下、逐步细化的过程,更侧重于过程之间的关系。存在问题:面对复杂的问题时,过程之间相互调用,步骤流程错综复杂,面向过程就很难解决,或者代码会特别繁杂。类和对象024.2类和对象Python作为面向对象的语言,其实现基础就是类和对象。类(class)是指具有相似特征和行为的事物的集合,是一种广义的数据类型,支持定义复杂数据的特性,包括静态特性(即数据抽象)和动态特性(即行为抽象,也就是对数据的操作方法),如:正方形、平行四边形都属于四边形这一类,而四边形的周长和面积则是对应的操作。对象是现实中该类事物的一个个体,是类的实例。一个类可以支持多个对象的创建,而创建类的一个实例的过程被称为实例化。例如:鸟类是一个类,其中具备性别,年龄等属性,会飞,鸣叫等是方法,而喜鹊、凤凰、鹦鹉等鸟类是几个对象。4.2类和对象类与对象的区别之处:类是对象的抽象,而对象是类的具体实例。类是抽象的,而对象是具体的。每一个对象都是某一个类的实例。每一个类在某一时刻都有零或更多的实例。类是静态的,它们的存在、语义和关系在程序执行前就已经定义好了,对象是动态的,它们在程序执行时可以被创建和删除。类是生成对象的模板。类定义与使用034.3类定义与使用类通过class定义,定义时类名一般需要首字母大写。定义格式如下:class类名:

属性名=属性值 def__init__(self,x,y): self.XXX=x self.XXX=y

def方法名(self):

方法体 def方法名(self):

方法体说明:定义类与内置类地位相同,可以出现在代码中的任何位置,最常见的是出现在模块外层,通过import语句导入并使用。类属性,是在类中方法之外定义的,可通过类名访问。此外,类属性也可通过对象访问,但一般不建议这样做,容易导致类属性值不一致的情况。类方法,是对动态特征的抽象,一个类中可定义多个不同的方法,而每个方法的第一个参数都是self,其代表要创建的对象本身。此外,类方法只能通过对象来调用,即向类发消息请求对象执行某个方法。class类名:

属性名=属性值

def__init__(self,x,y): self.XXX=x self.XXX=y def方法名(self):

方法体 def方法名(self):

方法体说明:构造函数(__init__)初始化程序,通常在创建和初始化这个类的新对象时被调用,Python提供一个默认的构造函数。如果类中没有显性定义__init__()方法,则创建对象时调用默认方法,不做任何操作,直接返回一个对象;如果类中显性定义了__init__()方法,则创建对象时会优先调用显式方法。__init__()方法的第一个参数是self,表示正在创建的对象,可以通过方法体中的语句实现为对象的属性赋值。该方法还可以有多个参数,创建对象时需要为这些参数提供实际值,从而实现对象属性的操作。4.3类定义与使用类的使用是在主函数,具体语法格式如下:对象名=类名()对象名.方法名()【分析】:类定义放在CLASS.py文件中,在本例中使用到其中的Student类,采用导入模块的形式将其导入。利用“Student”类创建一个对象名为“zhangsan”的对象,创建时采用Python默认的构造函数,并通过“类名.属性”和“对象名.方法名”的方式访问类属性(age)和对应的方法(learning()和play()方法)。[例4-1]类的定义实例。4.3类定义与使用【分析】:类定义放在CLASS.py文件中,在本例中使用到其中的Student_new类。在类定义中定义了类属性(age)、对象属性(weight和height)和方法(BMI())。在主函数中创建一个名为“wangwu”的对象,创建时采用显式定义的构造函数__init__,并将其初始化,传入对象的身高和体重。以“对象名.属性”和“对象名.方法名”的方式访问类属性和对应的方法,同时在主函数中修改属性值。[例4-2]类的定义实例。4.3类定义与使用属性044.4.1实例属性和类属性类属性:在定义类中且在方法之外定义的属性,是所有类的对象都具有的属性。通常情况下,类属性一般通过类名进行访问,也可通过对象名进行类属性的访问,但一般不推荐,容易造成属性值不一致的情况。同时可在主函数中直接修改属性值或者直接添加属性,如“Student”类中的“age”属性。实例属性:定义在构造函数__init__中的属性,定义时以self为前缀。实例属性是描述某一对象特征的数据,故而只专属于对象的属性,也只能通过对象名访问,如Student_new类中的self.weight和self.height属性。实例属性的设置也比较灵活,可以在定义类中的__init__方法中设置,也可在主函数中直接添加修改。[例4-3]类的实例属性与类属性实例。(Student_new参照4-2)【分析】:类定义放在CLASS.py文件中,在本例中使用到其中的Studen_new类。创建对象时采用显式定义的构造函数__init__,并通过“对象名.属性”和“对象名.方法名”的方式访问类属性和对应的方法。同时在主函数中对已有的类属性和实例属性修改,并新增类属性(sex)和实例属性(score)。4.4.1实例属性和类属性在有时,类中的一些属性不希望对外公开,因此屏蔽一些属性值在实现功能时有较大意义。Python中默认的成员函数和成员变量都是公开的,其中的私有属性和方法没有类似Java中public、private等关键词来修饰,所以仅以编程来实现区分。私有属性:属性名前有前缀“__”的属性,一般情况下,只能在类的内部调用,但也可以在类外部以“实例名._类名__私有属性名”的方式访问。公有属性:除私有属性外,其余均为公有属性。4.4.2公有属性和私有属性[例4-4]类的共有属性和私有属性实例。【分析】:在本例中使用到其中的Student_private类。定义类中分别定义了私有属性(__age和__weight)和公有属性,并在方法中直接调用了私有属性(__age属性)。创建对象时采用显式定义的构造函数__init__,并通过“对象名.属性”和“对象名.方法名”的方式访问公有的类属性和对应的方法,但不适用于私有方法的访问,否则会报错。4.4.2公有属性和私有属性[例4-4]类的共有属性和私有属性实例。(以下是错误示范)4.4.2公有属性和私有属性用户不能用wangwu.__weight方式访问学生体重,然而用户也就知道了__weight是个私有变量。我们有没有一种方法让用户通过wangwu.weight来访问学生分数同时继续保持__weight私有变量的属性呢?这时我们可以借助python的@property装饰器。[例4-5]装饰器实例。注意:一旦给函数加上装饰器@property,调用函数的时候可以不加括号直接调用。4.4.2公有属性和私有属性方法054.5方法实例方法:在类中定义的,一般以self作为第一个参数,self代表调用这个方法的对象本身,相当于Java中this的效果,而在方法调用时,可以不用传入self参数,Python会自动将调用这个方法的对象作为参数传入,这也进一步说明实例方法只可以通过对象进行调用。在类定义中,可以通过self关键词实现对象属性的修改,当方法体中的属性与类属性同名时,会覆盖类属性的值。类方法:使用修饰器@classmethod修饰的方法,它的第一个参数是“cls”,表示类本身,作用如同self。类方法可以通过类名或对象名调用。静态方法:是使用修饰器@staticmethod修饰的方法,该方法既不需要对象参数self,也不需要类参数cls,所以该方法没有默认参数。在调用静态方法时,可以通过类名或对象名来调用。4.5.1实例方法[例4-6]实例方法实例。【分析】:在本例中,类定义放在CLASS.py文件中,在本例中使用到其中的Cars类,Cars类中的类属性与方法中的属性同名(即“price”属性),创建c1对象.从结果可以看出,在访问Price_used()方法之前,使用c1对象访问的price属性值为100,说明访问的是类属性。在调用对象方法后,再使用c1对象访问的price属性值为80,此时访问的是对象方法中的同名属性。4.5.2类方法[例4-7]类方法实例。【分析】:类定义放在CLASS.py文件中,在本例中使用到其中的Books类,类声明中分别定义了实例方法(sell_one())和类方法(sell_two())。从前2个调用结果看,在调用实例方法(sell_one)后,类属性的值没发生改变,但调用类方法(sell_two)后,类的属性值发生变化;对比后2个调用结果,可见类和对象都可调用类方法。4.5.3静态方法[例4-8]静态方法实例。【分析】:从运行结果来看,类和对象均可实现静态方法的调用。继承064.6类的继承继承是面向对象的一个重要特征,反映类与类之间的一种所属关系,其中已经存在的定义类一般称为“父类”,而将要在父类基础上定义的类称为“子类”。当子类具有与父类相同的属性和方法时,不需要重复相同的代码,只需直接定义新增的特征或方法。例如:在“学生”类的基础上再定义新的子类“小学生”、“中学生”或“大学生”。这些子类完全拥有“学生”类的属性和方法。如果父类中有私有属性或方法时,子类不能继承。继承使用的语法格式为:class父类名:

方法体class子类名(父类名):

方法体注:子类定义中的父类名表示其继承自哪一个父类,可以是简单的单个类名,也可以是多个类名,还可以是复杂的表达式,只要值是类对象。当有多个类名时,中间以逗号“,”隔开,也表示子类继承自多个父类,称为多继承。4.6.1隐形继承1、隐性继承是指子类完全继承父类的全部属性与方法,没有在子类方法体中定义其他的属性或方法,从而子类具有和父类一样的特征与功能,但如果父类中含有私有属性或方法时,子类并不能继承。【分析】:本代码定义一个Animal类,类中定义了属性foot和eating()方法,并输出一个字符串。然后又定义一个Bird类,继承自Animal类,方法体中没有新增任何其他方法或属性。最后又创建了一个magpie对象,并访问其foot属性与eating()方法。[例4-9]隐性继承实例。结论:子类对象不能直接访问父类的私有属性和私有方法。子类对象可以通过访问父类方法从而间接访问父类的私有属性。[例4-10]子类对象访问父类实例。4.6.1隐形继承4.6.2覆盖2、覆盖

在子类与父类的继承关系中,会出现子类方法名与父类方法名同名的情况,但其功能却不一样,在调用该方法时父类方法被完全覆盖,即对象调用了子类中的同名方法。【分析】:初始化一个子类对象,调用born()方法,结果显示执行的是子类定义中的方法。[例4-11]覆盖实例。4.6.3

super继承3、super继承:如果子类和父类有同名方法时,子类的方法会将父类方法覆盖。而在实际需要中,我们有时需要调用父类的同名方法,这就需要用到super关键字。

super函数经常使用在子类构造函数__init__()的重写上,其使用格式如下:

super().XXX()

注意:XXX()为方法名。这种形式不带任何参数,其一般出现在子类方法的定义里,在调用这一方法时,解释器会先找到这一对象的直接父类,再在父类中开始找寻XXX()方法,并执行,然后再执行所在子类方法。【分析】:magpie对象要求调用born()方法,这一方法是指子类中的方法,其方法体中含有super().born(),所以解释器从magpie所属父类(Animal)开始查找born()方法,并执行,之后解释器才执行子类的born()方法中的内容。4.6.3

super继承[例4-12]super继承实例。4、多重继承是指子类不仅仅可以继承一个父类,还可以继承多个父类。例如:青蛙,既可以在陆地生活,也可以在水中生活。【分析】:首先申明是2个父类,其类的定义中均包含相同的属性(foot)和方法(get_foot()),以及不同名的方法。子类Frog的定义中指明了属性和方法继承至哪个父类。主函数中分别访问了两个父类的方法及同名方法。结果显示,Frog类的对象同时继承了两个父类的方法。4.6.4多重继承[例4-12]super继承实例。运算符重载074.7运算符重载Python中允许用户使用一些特定的方法实现运算符重载,从而使类的实例对象支持Python的各种内置操作。方法说明运算符__add__(self,num)加法self+num__sub__(self,num)减法Self-num__mul__(self,num)乘法Self*num__mod__(self,num)取余Self%num__pow__(self,num)幂运算Self**num__truediv__(self,num)除法Self/num__radd__(self,num)加法num+self__iadd__(self,num)加法self+=num__and__(self,num)位与self&num__or__(self,num)位或self|num运算符重载方法(部分)4.7运算符重载[例4-14]运算符重载实例。【分析】:本例中定义了一个Calculator类,并重载__add__()和__sub__()方法,初始化一个对象后,对其进行加减运算。本章实践例题本章实践例题[例4-15]定义父类SchoolMember,定义子类Teacher和Student,实现学校人员登记。本章实践例题[例4-16]定义类Triangle,实现能根据输入的三边,计算三角形的周长和面积。本章实践例题[例4-17]定义类Clock,实现数字时钟计时。小结本章结合实例介绍了Python中面向对象编程的基础内容,主要包括类的属性与方法的介绍以及相关应用实例的分析,帮助理解面向对象的编程思想。需重点掌握的内

温馨提示

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

评论

0/150

提交评论