第8章-PythonPytho程序设计基础教程-面向对象编程ppt课件.pptx

上传人:飞****2 文档编号:29617156 上传时间:2022-08-01 格式:PPTX 页数:27 大小:533.20KB
返回 下载 相关 举报
第8章-PythonPytho程序设计基础教程-面向对象编程ppt课件.pptx_第1页
第1页 / 共27页
第8章-PythonPytho程序设计基础教程-面向对象编程ppt课件.pptx_第2页
第2页 / 共27页
点击查看更多>>
资源描述

《第8章-PythonPytho程序设计基础教程-面向对象编程ppt课件.pptx》由会员分享,可在线阅读,更多相关《第8章-PythonPytho程序设计基础教程-面向对象编程ppt课件.pptx(27页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、PythonPython语言程序设计语言程序设计南京邮电大学计算机学院南京邮电大学计算机学院第第8 8章章 面向面向对对象象编编程程学习目标学习目标l掌握掌握定义类的方法定义类的方法l掌握掌握创建和使用对象的方法创建和使用对象的方法l掌握掌握类的继承的概念和使用方法类的继承的概念和使用方法3 38.1 类和对象类和对象l面向对象编程是模拟人类认识事物的方式的编程方法,是面向对象编程是模拟人类认识事物的方式的编程方法,是最有效的编程方法之一。人类通过将事物进行分最有效的编程方法之一。人类通过将事物进行分类类来认识来认识世界,比如,人类将自然界中的事物分类生物和非生物,世界,比如,人类将自然界中的

2、事物分类生物和非生物,又将生物分为动物、植物、微生物,又将动物分为有脊椎又将生物分为动物、植物、微生物,又将动物分为有脊椎动物和无脊椎动物,继而又分为哺乳类、鸟类、鱼类、爬动物和无脊椎动物,继而又分为哺乳类、鸟类、鱼类、爬行类等,哺乳类又分为猫、狗、牛、羊等。每一个类的个行类等,哺乳类又分为猫、狗、牛、羊等。每一个类的个体都具有一些共同的属性,在面向对象编程中,个体被称体都具有一些共同的属性,在面向对象编程中,个体被称为为对象对象,又称为,又称为实例实例。在本章的学习中,类、对象、实例。在本章的学习中,类、对象、实例是三个常用的术语。是三个常用的术语。4 4Person类的定义和实例化类的定义

3、和实例化l接下来我们来定义人的类接下来我们来定义人的类Person类,人有名字(类,人有名字(name)、性别()、性别(gender)、体重()、体重(weight)等属性,根据这)等属性,根据这个说明,我们可以定义个说明,我们可以定义Person类并创建类并创建Person对象,如对象,如以下代码所示:以下代码所示:5 5# #代码块代码块1 1:类的定义:类的定义class Person:class Person: defdef _ _initinit_(self):_(self): self.name= self.name=韩信韩信 self.genderself.gender=男男

4、self.weightself.weight=70=70 print(An instance print(An instance created)created)# #代码块代码块2 2:类的实例化:类的实例化p1=Person()p1=Person()print(p1.name)print(p1.name)print(p1.gender)print(p1.gender)print(p1.weight)print(p1.weight)l代码代码块块1定义了定义了Person类,说明如下:类,说明如下:1.class是定义类的关键字,是定义类的关键字,Person是类名是类名,在,在Python

5、定义定义类的格式是类的格式是“class 类名类名”,这是一个固定格式,这是一个固定格式。2.这个类中只有一个函数,类中的函数也称为这个类中只有一个函数,类中的函数也称为“方法方法”,该,该方法的名称为方法的名称为_init_,前面学到的有关函数的一切都适,前面学到的有关函数的一切都适用于方法,唯一重要的差别是调用方法的方式。用于方法,唯一重要的差别是调用方法的方式。_init_()不是普通方法,是一个特殊的方法,其作用是:每当你根不是普通方法,是一个特殊的方法,其作用是:每当你根据据Person 类创建新实例时,类创建新实例时,Python都会自动运行它。在都会自动运行它。在这个方法的名称中

6、,开头和末尾各有两个下划线,这是一这个方法的名称中,开头和末尾各有两个下划线,这是一种约定,旨在与普通方法进行区分。种约定,旨在与普通方法进行区分。6 63.在在_init_()方法的定义中,形参方法的定义中,形参self 必不可少,还必须位于必不可少,还必须位于其他形参的前面。为何必须在方法定义中包含形参其他形参的前面。为何必须在方法定义中包含形参self 呢?因为呢?因为Python调用这个调用这个_init_() 方法来创建方法来创建Dog 实例时,将自动实例时,将自动传入实参传入实参self ,每个与类相关联的方法调用都自动传递实参,每个与类相关联的方法调用都自动传递实参self,让实

7、例能够访问类中的属性和方法。我们创建,让实例能够访问类中的属性和方法。我们创建Dog 实例时,实例时,Python将调用将调用Person 类的方法类的方法_init_() ,self 会自动传递,会自动传递,因此我们不需要传递它。因此我们不需要传递它。4._int_()方法中有三条赋值语句,定义了三个变量方法中有三条赋值语句,定义了三个变量name、gender和和weight,这三个变量都有前缀,这三个变量都有前缀self。以。以self 为前缀的变为前缀的变量都可供类中的所有方法使用,我们还可以通过类的任何实例来量都可供类中的所有方法使用,我们还可以通过类的任何实例来访问这些变量。访问这

8、些变量。self.name=张三张三将变量将变量name赋值为赋值为“韩信韩信”,然后该变量被关联到当前创建的实例。,然后该变量被关联到当前创建的实例。self.gender=男男和和self.weight=70的作用与此类似。像这样带有前缀的作用与此类似。像这样带有前缀self的、可通的、可通过实例访问的变量称为属性。过实例访问的变量称为属性。7 7l代码块代码块2紧接在类紧接在类Person的定义语句后面,是使用的定义语句后面,是使用类类Person创建对象的代码,创建了两个名为创建对象的代码,创建了两个名为p1和和p2的的Person对象,也称为对象,也称为Person实例。代码块实例。

9、代码块2的的解释如下:解释如下:1.使用使用Person()创建一个对象,并赋值给创建一个对象,并赋值给p1对象变量,对象变量,p1是这个对象的对象名,在创建对象时自动调用是这个对象的对象名,在创建对象时自动调用Person类的类的_init_()方法方法。2.使用使用“.”号访问号访问p1的属性,包括的属性,包括name、gender、weight,“.”符号是访问对象的属性和方法的特殊符号。符号是访问对象的属性和方法的特殊符号。8 8Person类的完整定义类的完整定义9 9class class Person:Person: defdef _ _initinit_(_(self,name

10、,gender,weightself,name,gender,weight):): self.name=name self.name=name self.genderself.gender=gender=gender self.weightself.weight=weight=weight print(A person named %s is created % self.name) print(A person named %s is created % self.name) defdef eat( eat(self,foodself,food):): self.weightself.wei

11、ght= =self.weight+foodself.weight+food print(%s eat %s food, and my weight is %d % ( print(%s eat %s food, and my weight is %d % (self.name,foodself.name,food, , self.weightself.weight) defdef run(self): run(self): self.weightself.weight=self.weight-1=self.weight-1 print(%s print(%s runnedrunned, an

12、d my weight is %d % (, and my weight is %d % (self.name,self.weightself.name,self.weight) defdef say(self): say(self): print(My name is %s % (self.name) print(My name is %s % (self.name)l该代码重新定义了该代码重新定义了Person类,与上一节中定义的类,与上一节中定义的Person类不同的点如下:类不同的点如下:1._init_()方法拥有除方法拥有除self外的三个参数:外的三个参数:name、gender

13、、weight,分别赋值给,分别赋值给self.name、self.gener、self.weight。在创建在创建Person对象的时候可以通过传不同的值创建不同的对象对象的时候可以通过传不同的值创建不同的对象,如在代码块,如在代码块4中,通过中,通过p1=Person(韩信韩信,男男,70),创建一,创建一个名为韩信,男性,体重个名为韩信,男性,体重70的的Person对象,通过对象,通过p2=Person(王昭君王昭君,女女,50)创建一个名为王昭君,女性,体重创建一个名为王昭君,女性,体重50的的Person对象。对象。2.定义定义了了eat()方法,该方法的参数是方法,该方法的参数是

14、self和和food:self表示当前表示当前调用调用eat()的对象,的对象,food是一个数字类型参数,表示吃进去的食是一个数字类型参数,表示吃进去的食物重量,通过物重量,通过self.weight=self.weight+food使得调用使得调用eat()方法的方法的Person对象体重增加,如对象体重增加,如p1.eat(2)表示表示Person对象对象p1的体重增加的体重增加2,同时显示信息。,同时显示信息。10103.定义了定义了run()方法,该方法只有一个参数方法,该方法只有一个参数self,通过,通过self.weight=self.weight-1使得调用使得调用run()

15、的对象体的对象体重减重减1,如,如p1.run(),表示,表示Person对象对象p1通过跑步通过跑步锻炼体重降低了锻炼体重降低了1,同时显示信息。,同时显示信息。4.定义了定义了say()方法,该方法只有一个参数方法,该方法只有一个参数self,通过,通过print(My name is %s % (self.name)语句自我语句自我介绍,如介绍,如p2.say(),输出,输出“王昭君王昭君”,自我介绍。,自我介绍。5.代码块代码块4创建了两个不同的创建了两个不同的Person对象,分别是对象,分别是p1和和p2,分别调用他们的,分别调用他们的eat()、run()、say()方法。方法。

16、1111对象对象属性的默认值设置属性的默认值设置l可以为属性在可以为属性在_init_()方法中设置默认值,代方法中设置默认值,代码如下码如下:1212# # 例例 8 38 3在类的定义中加入初始化代码在类的定义中加入初始化代码defdef _ _initinit_(self, name, gender=_(self, name, gender=男男, weight=70):, weight=70): self._nameself._name=name=name self.genderself.gender =gender =gender self.weightself.weight=wei

17、ght=weight print(A person named %s is created % print(A person named %s is created % self._nameself._name) )对象对象属性属性的修改的修改1313# # 例例 8 8 4 4属性值的添加、修改与删除示例属性值的添加、修改与删除示例p1=Person(p1=Person(安琪拉安琪拉,女女,45),45)p1.height=170p1.height=170p1.weight=46p1.weight=46print(p1.height, p1.weight)print(p1.height, p

18、1.weight)del p1.heightdel p1.heightprint(p1.height, p1.weight)print(p1.height, p1.weight)l其中:其中:1.p1.height=70为对象为对象p1添加了一个名为添加了一个名为height的属性并赋值为的属性并赋值为70,height属性在属性在Person类中没有定义,只在类中没有定义,只在p1对象中存在。对象中存在。2.p1.weight=46将对象将对象p1的的weight属性的属性的值修改为值修改为46。3.del p1.height删除对象删除对象p1的的height属性。属性。1414私有私有属

19、性和私有方法属性和私有方法1515# # 例例 8 8 5 5私有属性的使用示例私有属性的使用示例class Person:class Person: defdef _ _initinit_(_(self,name,genderself,name,gender=男男,weight=70):,weight=70): self._nameself._name=name=name self.genderself.gender=gender=gender self._weightself._weight=weight=weight print(A person named %s is created

20、% print(A person named %s is created % self._nameself._name) ) defdef eat( eat(self,foodself,food):): self._ self._setWeightsetWeight(self._(self._weight+foodweight+food) ) print(%s eat %s food, and my weight is %d % (self._ print(%s eat %s food, and my weight is %d % (self._name,foodname,food, , se

21、lf._weightself._weight) defdef run(self): run(self): self._weightself._weight=self._weight-1=self._weight-1 print(%s print(%s runnedrunned, and my weight is %d % (, and my weight is %d % (self._name,self._weightself._name,self._weight) defdef say(self): say(self): print(My name is %s % ( print(My na

22、me is %s % (self._nameself._name) defdef _ _setWeightsetWeight(self, weight):(self, weight): self._weightself._weight=weight=weightl以上代码定义了两个私有属性以上代码定义了两个私有属性_name和和_weight,一个私有方法,一个私有方法_setWeight(),“_”和和“_”的不同之处在于:的不同之处在于:1.单下划线单下划线“_”开头:只是告诉别人这是私有属性,开头:只是告诉别人这是私有属性,外部依然可以访问更改,所以外部依然可以访问更改,所以p4._na

23、me可以正常访可以正常访问;问;2.双下划线双下划线“_”开头:比如开头:比如_weight属性不可通过属性不可通过p4._weight来访问或者更改,来访问或者更改,p4._setWeight(80)不可以调用,但是可以在类内部的方法调用,比不可以调用,但是可以在类内部的方法调用,比如如eat()方法调用了方法调用了_setWeight()方法,方法,run()方方法修改了法修改了_weight属性。属性。1616类类属性属性1717# # 例例 8 8 6 6类属性的使用示例类属性的使用示例# #代码块代码块7 7:类的定义:类的定义class Person:class Person: c

24、ount=0 count=0 defdef _ _initinit_(_(self,name,genderself,name,gender=男男,weight=70):,weight=70): self._nameself._name=name=name self.genderself.gender=gender=gender self._weightself._weight=weight=weight Person.countPerson.count=Person.count+1=Person.count+1 print(A person named %s is created % prin

25、t(A person named %s is created % self._nameself._name) )8.2. 类类的继承的继承l面向对象的编程带来的主要好处之一是代面向对象的编程带来的主要好处之一是代码的重用,实现这种重用的方法之一是通码的重用,实现这种重用的方法之一是通过继承机制。一个类继承另一个类时,它过继承机制。一个类继承另一个类时,它将自动获得另一个类的所有属性和方法;将自动获得另一个类的所有属性和方法;原有的类称为父类,而新类称为子类。子原有的类称为父类,而新类称为子类。子类继承了其父类的所有属性和方法,同时类继承了其父类的所有属性和方法,同时还可以定义自己的属性和方法。

26、继承完全还可以定义自己的属性和方法。继承完全可以理解成类之间的类型和子类型关系。可以理解成类之间的类型和子类型关系。1818一一个简单的继承例子个简单的继承例子1919class class Person:Person: defdef _ _initinit_(_(self,name,genderself,name,gender=男男,weight=70):,weight=70): self.name=name self.name=name self.genderself.gender=gender=gender self.weightself.weight=weight=weight pri

27、nt(A person named %s is created % self.name) print(A person named %s is created % self.name) defdef say(self): say(self): print(My name is %s % (self.name) print(My name is %s % (self.name)class Teacher(Person):class Teacher(Person): defdef teach(self, lesson): teach(self, lesson): print(%s print(%s

28、 teachsteachs %s % ( %s % (self.name,lessonself.name,lesson)class Student(Person):class Student(Person): defdef study(self, lesson): study(self, lesson): print(%s studies %s % ( print(%s studies %s % (self.name,lessonself.name,lesson)l关于以上代码的说明如下:关于以上代码的说明如下:1.定义定义了三个类:了三个类:Person类、类、Teacher类、类、Stud

29、ent类类。其中,。其中,Person类是基类,类是基类,Teacher和和Student继承继承了了Person类,是其派生类,派生的语法分别是类,是其派生类,派生的语法分别是class Teacher(Person)和和class Student(Person)。2.Person类拥有三个对象属性:类拥有三个对象属性:name、gender、weight,一个初始化方法,一个初始化方法_int_(),一个普通对象方法,一个普通对象方法say();Teacher类中只定义了一个对象方法类中只定义了一个对象方法teach();Student类只定义了一个对象方法类只定义了一个对象方法study

30、()。20203.由于由于Teacher和和Student是是Person的派生类的派生类,所以可以重用,所以可以重用Person的三个属性和两个方的三个属性和两个方法。在用法。在用t=Teacher(孔子孔子,男男,70)语句创语句创建建Teacher对象对象t的时候,也需要传入三个参的时候,也需要传入三个参数,自动调用基类数,自动调用基类Person的的_init_()方法方法,创建,创建Student对象同理。对象同理。4.创建创建的的Teacher对象对象t可以访问可以访问teach()方法方法,和基类中的,和基类中的say()方法,也可以访问基类中方法,也可以访问基类中的的name、

31、gender、weight属性。属性。2121子子类方法对父类方法的覆盖类方法对父类方法的覆盖2222class Person:class Person: defdef _ _initinit_(_(self,name,genderself,name,gender=男男,weight=70):,weight=70): self.name=name self.name=name self.genderself.gender=gender=gender self.weightself.weight=weight=weight print(A person named %s is created %

32、 self.name) print(A person named %s is created % self.name) defdef say(self): say(self): print(My name is %s % (self.name) print(My name is %s % (self.name)class Teacher(Person):class Teacher(Person): defdef say(self): say(self): print(%s is a teacher % self.name) print(%s is a teacher % self.name)c

33、lass Student(Person):class Student(Person): defdef say(self): say(self): print(%s is a student % self.name) print(%s is a student % self.name)调用调用父类的同名方法父类的同名方法2323class Person:class Person: defdef _ _initinit_(_(self,name,genderself,name,gender=男男,weight=70):,weight=70): self.name=name self.name=na

34、me self.genderself.gender=gender=gender self.weightself.weight=weight=weight print(A person named %s is created % self.name) print(A person named %s is created % self.name) defdef say(self): say(self): print(My name is %s % (self.name) print(My name is %s % (self.name)class Teacher(Person):class Tea

35、cher(Person): defdef _ _initinit_(self, _(self, name,gendername,gender=男男,weight=70, title=,weight=70, title=讲师讲师):): Person._ Person._initinit_(_(self,name,gender,weightself,name,gender,weight) ) self.titleself.title=title=title defdef say(self): say(self): Person.sayPerson.say(self)(self) print(%s

36、 is a teacher % self.name) print(%s is a teacher % self.name) defdef teach(self, lesson): teach(self, lesson): print(%s print(%s teachsteachs %s % ( %s % (self.name,lessonself.name,lesson) )l在这个代码中,子类在这个代码中,子类Teacher和子类和子类Student中定义了与中定义了与父类父类Person同名的方法同名的方法_int_()方法和方法和say()方法:方法:1.子子类类Teacher中的中的

37、_int_()方法传入四个参数:方法传入四个参数:name、gender、weight、title,通过调用,通过调用Person._init_(self, name, gender, weight)为父类为父类Person中的三个属性赋值,中的三个属性赋值,title表表示教师测职称,是示教师测职称,是Teacher类的专有对象属性。同理,子类类的专有对象属性。同理,子类Student的的_init_()方法也传入四个参数,前三个为父类中的三方法也传入四个参数,前三个为父类中的三个对应属性赋值,个对应属性赋值,major表示学生的专业,是表示学生的专业,是Student类的专类的专有对象属性

38、。有对象属性。2.子子类类Teacher中的中的say()中通过中通过Person.say(self)语句调用了父语句调用了父类类Person的的say()方法介绍自己的姓名,随后通过方法介绍自己的姓名,随后通过print(%s is a teacher % self.name)语句调用说明自己是教师;同理语句调用说明自己是教师;同理,子类,子类Student中的中的say()中通过调用父类的中通过调用父类的say()方法介绍自方法介绍自己的姓名,随后通过己的姓名,随后通过print(%s is a student% self.name)语句调用说明自己是学生。语句调用说明自己是学生。2424

39、l因此,我们可以看出在因此,我们可以看出在Python中继承中的一些特中继承中的一些特点:点:1.在继承中基类的构造(在继承中基类的构造(_init_()方法)不会被自动方法)不会被自动调用,它需要在其派生类的构造中亲自专门调用。调用,它需要在其派生类的构造中亲自专门调用。2.在调用基类的方法时,需要加上基类的类名前缀,且在调用基类的方法时,需要加上基类的类名前缀,且需要带上需要带上self参数变量。区别在于类中调用普通函数参数变量。区别在于类中调用普通函数时并不需要带上时并不需要带上self参数。参数。3.Python总是首先查找对应类型的方法,如果它不能总是首先查找对应类型的方法,如果它不

40、能在派生类中找到对应的方法,它才开始到基类中逐个在派生类中找到对应的方法,它才开始到基类中逐个查找。(先在本类中查找调用的方法,找不到才去基查找。(先在本类中查找调用的方法,找不到才去基类中找)。类中找)。2525本章本章小结小结l通过本章的学习,我们学习了面向对象编程的相关知识,通过本章的学习,我们学习了面向对象编程的相关知识,包括类的定义、对象的创建、对象的使用、类的继承、子包括类的定义、对象的创建、对象的使用、类的继承、子类和父类的关系等。类和父类的关系等。l定义类的方法是使用定义类的方法是使用class关键字,根据类可以创建对象关键字,根据类可以创建对象,对象又称为类的实例,在创建对象

41、时自动调用类的,对象又称为类的实例,在创建对象时自动调用类的_init_()方法,如果有参数还需要传入参数。类中的属性方法,如果有参数还需要传入参数。类中的属性和方法可以是私有的,也可以是私有的,私有属性和私有和方法可以是私有的,也可以是私有的,私有属性和私有方法不能在类的外部被调用。方法不能在类的外部被调用。l一个类可以被继承产生派生类,派生类又称为子类,被派一个类可以被继承产生派生类,派生类又称为子类,被派生的类被称为基类或父类。子类可以重用父类中的属性和生的类被称为基类或父类。子类可以重用父类中的属性和方法,子类中的方法还会覆盖父类中的同名方法,在子类方法,子类中的方法还会覆盖父类中的同名方法,在子类的方法中需要通过父类名访问父类中的同名方法。的方法中需要通过父类名访问父类中的同名方法。262627

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 教案示例

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com