




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2018.2Python语言程序设计南京邮电大学计算机学院2018.2Python语言程序设计南京邮电大学计算机学院第8章面向对象编程第8章面向对象编程学习目标掌握定义类的方法掌握创建和使用对象的方法掌握类的继承的概念和使用方法3学习目标掌握定义类的方法38.1类和对象面向对象编程是模拟人类认识事物的方式的编程方法,是最有效的编程方法之一。人类通过将事物进行分类来认识世界,比如,人类将自然界中的事物分类生物和非生物,又将生物分为动物、植物、微生物,又将动物分为有脊椎动物和无脊椎动物,继而又分为哺乳类、鸟类、鱼类、爬行类等,哺乳类又分为猫、狗、牛、羊等。每一个类的个体都具有一些共同的属性,在面向对象编程中,个体被称为对象,又称为实例。在本章的学习中,类、对象、实例是三个常用的术语。48.1类和对象面向对象编程是模拟人类认识事物的方式的编程方Person类的定义和实例化接下来我们来定义人的类Person类,人有名字(name)、性别(gender)、体重(weight)等属性,根据这个说明,我们可以定义Person类并创建Person对象,如以下代码所示:5#代码块1:类的定义classPerson:def__init__(self):='韩信'self.gender='男'self.weight=70print('Aninstancecreated')#代码块2:类的实例化p1=Person()print()print(p1.gender)print(p1.weight)Person类的定义和实例化接下来我们来定义人的类Perso代码块1定义了Person类,说明如下:class是定义类的关键字,Person是类名,在Python定义类的格式是“class类名”,这是一个固定格式。这个类中只有一个函数,类中的函数也称为“方法”,该方法的名称为__init__,前面学到的有关函数的一切都适用于方法,唯一重要的差别是调用方法的方式。__init__()不是普通方法,是一个特殊的方法,其作用是:每当你根据Person类创建新实例时,Python都会自动运行它。在这个方法的名称中,开头和末尾各有两个下划线,这是一种约定,旨在与普通方法进行区分。6代码块1定义了Person类,说明如下:6在__init__()方法的定义中,形参self必不可少,还必须位于其他形参的前面。为何必须在方法定义中包含形参self呢?因为Python调用这个__init__()方法来创建Dog实例时,将自动传入实参self,每个与类相关联的方法调用都自动传递实参self,让实例能够访问类中的属性和方法。我们创建Dog实例时,Python将调用Person类的方法__init__(),self会自动传递,因此我们不需要传递它。__int__()方法中有三条赋值语句,定义了三个变量name、gender和weight,这三个变量都有前缀self。以self为前缀的变量都可供类中的所有方法使用,我们还可以通过类的任何实例来访问这些变量。='张三'将变量name赋值为“韩信”,然后该变量被关联到当前创建的实例。self.gender='男'和self.weight=70的作用与此类似。像这样带有前缀self的、可通过实例访问的变量称为属性。7在__init__()方法的定义中,形参self必不可少,代码块2紧接在类Person的定义语句后面,是使用类Person创建对象的代码,创建了两个名为p1和p2的Person对象,也称为Person实例。代码块2的解释如下:使用Person()创建一个对象,并赋值给p1对象变量,p1是这个对象的对象名,在创建对象时自动调用Person类的__init__()方法。使用“.”号访问p1的属性,包括name、gender、weight,“.”符号是访问对象的属性和方法的特殊符号。8代码块2紧接在类Person的定义语句后面,是使用类PersPerson类的完整定义9classPerson:def__init__(self,name,gender,weight):=nameself.gender=genderself.weight=weightprint('Apersonnamed%siscreated'%)defeat(self,food):self.weight=self.weight+foodprint('%seat%sfood,andmyweightis%d'%(,food,self.weight))defrun(self):self.weight=self.weight-1print('%srunned,andmyweightis%d'%(,self.weight))defsay(self):print('Mynameis%s'%())Person类的完整定义9classPerson:该代码重新定义了Person类,与上一节中定义的Person类不同的点如下:__init__()方法拥有除self外的三个参数:name、gender、weight,分别赋值给、self.gener、self.weight。在创建Person对象的时候可以通过传不同的值创建不同的对象,如在代码块4中,通过p1=Person('韩信','男',70),创建一个名为韩信,男性,体重70的Person对象,通过p2=Person('王昭君','女',50)创建一个名为王昭君,女性,体重50的Person对象。定义了eat()方法,该方法的参数是self和food:self表示当前调用eat()的对象,food是一个数字类型参数,表示吃进去的食物重量,通过self.weight=self.weight+food使得调用eat()方法的Person对象体重增加,如p1.eat(2)表示Person对象p1的体重增加2,同时显示信息。10该代码重新定义了Person类,与上一节中定义的Person定义了run()方法,该方法只有一个参数self,通过self.weight=self.weight-1使得调用run()的对象体重减1,如p1.run(),表示Person对象p1通过跑步锻炼体重降低了1,同时显示信息。定义了say()方法,该方法只有一个参数self,通过print('Mynameis%s'%())语句自我介绍,如p2.say(),输出“王昭君”,自我介绍。代码块4创建了两个不同的Person对象,分别是p1和p2,分别调用他们的eat()、run()、say()方法。11定义了run()方法,该方法只有一个参数self,通过sel对象属性的默认值设置可以为属性在__init__()方法中设置默认值,代码如下:12#例83在类的定义中加入初始化代码def__init__(self,name,gender='男',weight=70):self._name=nameself.gender=genderself.weight=weightprint('Apersonnamed%siscreated'%self._name)对象属性的默认值设置可以为属性在__init__()方法中设对象属性的修改13#
例8‑4属性值的添加、修改与删除示例p1=Person('安琪拉','女',45)p1.height=170p1.weight=46print(p1.height,p1.weight)delp1.heightprint(p1.height,p1.weight)对象属性的修改13#例8‑4属性值的添加、修改与删除示例其中:p1.height=70为对象p1添加了一个名为height的属性并赋值为70,height属性在Person类中没有定义,只在p1对象中存在。p1.weight=46将对象p1的weight属性的值修改为46。delp1.height删除对象p1的height属性。14其中:14私有属性和私有方法15#例8‑5私有属性的使用示例classPerson:def__init__(self,name,gender='男',weight=70):self._name=nameself.gender=genderself.__weight=weightprint('Apersonnamed%siscreated'%self._name)defeat(self,food):self.__setWeight(self.__weight+food)print('%seat%sfood,andmyweightis%d'%(self._name,food,self.__weight))defrun(self):self.__weight=self.__weight-1print('%srunned,andmyweightis%d'%(self._name,self.__weight))defsay(self):print('Mynameis%s'%(self._name))def__setWeight(self,weight):self.__weight=weight私有属性和私有方法15#例8‑5私有属性的使用示例以上代码定义了两个私有属性_name和__weight,一个私有方法__setWeight(),“_”和“__”的不同之处在于:单下划线“_”开头:只是告诉别人这是私有属性,外部依然可以访问更改,所以p4._name可以正常访问;双下划线“__”开头:比如__weight属性不可通过p4.__weight来访问或者更改,p4.__setWeight(80)不可以调用,但是可以在类内部的方法调用,比如eat()方法调用了__setWeight()方法,run()方法修改了__weight属性。16以上代码定义了两个私有属性_name和__weight,一个类属性17#例8‑6类属性的使用示例#代码块7:类的定义classPerson:count=0def__init__(self,name,gender='男',weight=70):self._name=nameself.gender=genderself.__weight=weightPerson.count=Person.count+1print('Apersonnamed%siscreated'%self._name)类属性17#例8‑6类属性的使用示例8.2.类的继承面向对象的编程带来的主要好处之一是代码的重用,实现这种重用的方法之一是通过继承机制。一个类继承另一个类时,它将自动获得另一个类的所有属性和方法;原有的类称为父类,而新类称为子类。子类继承了其父类的所有属性和方法,同时还可以定义自己的属性和方法。继承完全可以理解成类之间的类型和子类型关系。188.2.类的继承面向对象的编程带来的主要好处之一是代码的重一个简单的继承例子19classPerson:def__init__(self,name,gender='男',weight=70):=nameself.gender=genderself.weight=weightprint('Apersonnamed%siscreated'%)defsay(self):print('Mynameis%s'%())classTeacher(Person):defteach(self,lesson):print("%steachs%s"%(,lesson))classStudent(Person):defstudy(self,lesson):print("%sstudies%s"%(,lesson))一个简单的继承例子19classPerson:关于以上代码的说明如下:定义了三个类:Person类、Teacher类、Student类。其中,Person类是基类,Teacher和Student继承了Person类,是其派生类,派生的语法分别是classTeacher(Person)和classStudent(Person)。Person类拥有三个对象属性:name、gender、weight,一个初始化方法__int__(),一个普通对象方法say();Teacher类中只定义了一个对象方法teach();Student类只定义了一个对象方法study()。20关于以上代码的说明如下:20由于Teacher和Student是Person的派生类,所以可以重用Person的三个属性和两个方法。在用t=Teacher('孔子','男',70)语句创建Teacher对象t的时候,也需要传入三个参数,自动调用基类Person的__init__()方法,创建Student对象同理。创建的Teacher对象t可以访问teach()方法,和基类中的say()方法,也可以访问基类中的name、gender、weight属性。21由于Teacher和Student是Person的派生类,所子类方法对父类方法的覆盖22classPerson:def__init__(self,name,gender='男',weight=70):=nameself.gender=genderself.weight=weightprint('Apersonnamed%siscreated'%)defsay(self):print('Mynameis%s'%())classTeacher(Person):defsay(self):print('%sisateacher'%)classStudent(Person):defsay(self):print('%sisastudent'%)子类方法对父类方法的覆盖22classPerson:调用父类的同名方法23classPerson:def__init__(self,name,gender='男',weight=70):=nameself.gender=genderself.weight=weightprint('Apersonnamed%siscreated'%)defsay(self):print('Mynameis%s'%())classTeacher(Person):def__init__(self,name,gender='男',weight=70,title='讲师'):Person.__init__(self,name,gender,weight)self.title=titledefsay(self):Person.say(self)print('%sisateacher'%)defteach(self,lesson):print("%steachs%s"%(,lesson))调用父类的同名方法23classPerson:在这个代码中,子类Teacher和子类Student中定义了与父类Person同名的方法__int__()方法和say()方法:子类Teacher中的__int__()方法传入四个参数:name、gender、weight、title,通过调用Person.__init__(self,name,gender,weight)为父类Person中的三个属性赋值,title表示教师测职称,是Teacher类的专有对象属性。同理,子类Student的__init__()方法也传入四个参数,前三个为父类中的三个对应属性赋值,major表示学生的专业,是Stude
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 量子计算技术助力金融风控2025年风险模拟应用深度解析
- 咖啡连锁品牌在咖啡文化交流活动中的扩张策略研究报告
- 面向2025年的共享出行平台信用体系建设与信用数据安全与隐私保护报告
- 《变形记》读后感4篇
- 2025年聚砜及其合金项目发展计划
- 西藏2025年上半年房地产经纪人《制度与政策》相关:城镇土地考试试题
- 私人工厂劳务派遣合同范本2025年
- 离婚协议书一方出轨(2025版)
- 6-综合训练循环小数
- 卖车协议书合同2025年
- 银行贷款政策课件
- 宁海县三资管理办法
- 2025版本的房屋征收补偿协议
- 2025社区工作者考试试题(含答案)
- 【真题】人教版七年级下学期7月期末数学试题(含解析)湖南省长沙市长沙市一中教育集团联考2024-2025学年
- SAVI综合征靶向治疗研究进展
- 物业资产考试试题及答案
- 氧化钨化学计量比对其物理化学性质的影响规律
- 口腔诊所污水管理制度
- DZ/T 0275.5-2015岩矿鉴定技术规范第5部分:矿石光片鉴定
- 苹果授权协议书
评论
0/150
提交评论