您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 薪酬管理 > 第8章-PythonPytho程序设计基础教程-面向对象编程
2018.2Python语言程序设计南京邮电大学计算机学院第8章面向对象编程学习目标掌握定义类的方法掌握创建和使用对象的方法掌握类的继承的概念和使用方法38.1类和对象面向对象编程是模拟人类认识事物的方式的编程方法,是最有效的编程方法之一。人类通过将事物进行分类来认识世界,比如,人类将自然界中的事物分类生物和非生物,又将生物分为动物、植物、微生物,又将动物分为有脊椎动物和无脊椎动物,继而又分为哺乳类、鸟类、鱼类、爬行类等,哺乳类又分为猫、狗、牛、羊等。每一个类的个体都具有一些共同的属性,在面向对象编程中,个体被称为对象,又称为实例。在本章的学习中,类、对象、实例是三个常用的术语。4Person类的定义和实例化接下来我们来定义人的类Person类,人有名字(name)、性别(gender)、体重(weight)等属性,根据这个说明,我们可以定义Person类并创建Person对象,如以下代码所示:5#代码块1:类的定义classPerson:def__init__(self):self.name='韩信'self.gender='男'self.weight=70print('Aninstancecreated')#代码块2:类的实例化p1=Person()print(p1.name)print(p1.gender)print(p1.weight)代码块1定义了Person类,说明如下:1.class是定义类的关键字,Person是类名,在Python定义类的格式是“class类名”,这是一个固定格式。2.这个类中只有一个函数,类中的函数也称为“方法”,该方法的名称为__init__,前面学到的有关函数的一切都适用于方法,唯一重要的差别是调用方法的方式。__init__()不是普通方法,是一个特殊的方法,其作用是:每当你根据Person类创建新实例时,Python都会自动运行它。在这个方法的名称中,开头和末尾各有两个下划线,这是一种约定,旨在与普通方法进行区分。63.在__init__()方法的定义中,形参self必不可少,还必须位于其他形参的前面。为何必须在方法定义中包含形参self呢?因为Python调用这个__init__()方法来创建Dog实例时,将自动传入实参self,每个与类相关联的方法调用都自动传递实参self,让实例能够访问类中的属性和方法。我们创建Dog实例时,Python将调用Person类的方法__init__(),self会自动传递,因此我们不需要传递它。4.__int__()方法中有三条赋值语句,定义了三个变量name、gender和weight,这三个变量都有前缀self。以self为前缀的变量都可供类中的所有方法使用,我们还可以通过类的任何实例来访问这些变量。self.name='张三'将变量name赋值为“韩信”,然后该变量被关联到当前创建的实例。self.gender='男'和self.weight=70的作用与此类似。像这样带有前缀self的、可通过实例访问的变量称为属性。7代码块2紧接在类Person的定义语句后面,是使用类Person创建对象的代码,创建了两个名为p1和p2的Person对象,也称为Person实例。代码块2的解释如下:1.使用Person()创建一个对象,并赋值给p1对象变量,p1是这个对象的对象名,在创建对象时自动调用Person类的__init__()方法。2.使用“.”号访问p1的属性,包括name、gender、weight,“.”符号是访问对象的属性和方法的特殊符号。8Person类的完整定义9classPerson:def__init__(self,name,gender,weight):self.name=nameself.gender=genderself.weight=weightprint('Apersonnamed%siscreated'%self.name)defeat(self,food):self.weight=self.weight+foodprint('%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))该代码重新定义了Person类,与上一节中定义的Person类不同的点如下:1.__init__()方法拥有除self外的三个参数:name、gender、weight,分别赋值给self.name、self.gener、self.weight。在创建Person对象的时候可以通过传不同的值创建不同的对象,如在代码块4中,通过p1=Person('韩信','男',70),创建一个名为韩信,男性,体重70的Person对象,通过p2=Person('王昭君','女',50)创建一个名为王昭君,女性,体重50的Person对象。2.定义了eat()方法,该方法的参数是self和food:self表示当前调用eat()的对象,food是一个数字类型参数,表示吃进去的食物重量,通过self.weight=self.weight+food使得调用eat()方法的Person对象体重增加,如p1.eat(2)表示Person对象p1的体重增加2,同时显示信息。103.定义了run()方法,该方法只有一个参数self,通过self.weight=self.weight-1使得调用run()的对象体重减1,如p1.run(),表示Person对象p1通过跑步锻炼体重降低了1,同时显示信息。4.定义了say()方法,该方法只有一个参数self,通过print('Mynameis%s'%(self.name))语句自我介绍,如p2.say(),输出“王昭君”,自我介绍。5.代码块4创建了两个不同的Person对象,分别是p1和p2,分别调用他们的eat()、run()、say()方法。11对象属性的默认值设置可以为属性在__init__()方法中设置默认值,代码如下:12#例83在类的定义中加入初始化代码def__init__(self,name,gender='男',weight=70):self._name=nameself.gender=genderself.weight=weightprint('Apersonnamed%siscreated'%self._name)对象属性的修改13#例8-4属性值的添加、修改与删除示例p1=Person('安琪拉','女',45)p1.height=170p1.weight=46print(p1.height,p1.weight)delp1.heightprint(p1.height,p1.weight)其中:1.p1.height=70为对象p1添加了一个名为height的属性并赋值为70,height属性在Person类中没有定义,只在p1对象中存在。2.p1.weight=46将对象p1的weight属性的值修改为46。3.delp1.height删除对象p1的height属性。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以上代码定义了两个私有属性_name和__weight,一个私有方法__setWeight(),“_”和“__”的不同之处在于:1.单下划线“_”开头:只是告诉别人这是私有属性,外部依然可以访问更改,所以p4._name可以正常访问;2.双下划线“__”开头:比如__weight属性不可通过p4.__weight来访问或者更改,p4.__setWeight(80)不可以调用,但是可以在类内部的方法调用,比如eat()方法调用了__setWeight()方法,run()方法修改了__weight属性。16类属性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)8.2.类的继承面向对象的编程带来的主要好处之一是代码的重用,实现这种重用的方法之一是通过继承机制。一个类继承另一个类时,它将自动获得另一个类的所有属性和方法;原有的类称为父类,而新类称为子类。子类继承了其父类的所有属性和方法,同时还可以定义自己的属性和方法。继承完全可以理解成类之间的类型和子类型关系。18一个简单的继承例子19classPerson:def__init__(self,name,gender='男',weight=70):self.name=nameself.gender=genderself.weight=weightprint('Apersonnamed%siscreated'%self.name)defsay(self):print('Mynameis%s'%(self.name))classTeacher(Person):defteach(self,lesson):print(%steachs%s%(self.name,lesson))classStudent(Person):defstudy(self,lesson):print(%sstudies%s%(self.name,lesson))关于以上代码的说明如下:1.定义了三个类:Person类、Teacher类、Student类。其中,Person类是基类,Teacher和Student继承了Person类,是其派生类,派生的语法分别是classTeacher(Person)和classStudent(Person)。2.Person类拥有三个对象属性:name、gender、weight,一个初始化方法__int__(),一个普通对象方法say();Teacher类中只定义了一个对象方法teach();Student类只定义了一个对象方法study()。203.由于Teacher和Student是Person的派生类,所以可以重用Person的三个属性和两个方法。在用t=Teacher('孔子','男',70)语句创建Teacher对象t的时候,也需要传入三个参数,自动调用基类Person的__init__()方法,创建Student对象同理。4.创建的Teacher对象t可以访问tea
本文标题:第8章-PythonPytho程序设计基础教程-面向对象编程
链接地址:https://www.777doc.com/doc-5110263 .html