Python-3基础教程-第5章

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

Python3基础教程出版社或系部名称主讲:授课教师姓名第5章面向对象编程面向对象是现代高级程序设计语言的特点之一。在前面各章中,已多次使用到“对象”这个概念。本章将深入对象的本质,学习对象的实现——类。类为Python提供了面向对象编程功能。作为初学者而言,面向对象编程并不是必须的。虽然在Python内部,对象是无处不在。但使用Python实现系统并不是必须使用面向对象编程。面向对象编程通常在开发大型系统时效率更高。本章主要内容对象的属性和方法理解Python的面向对象定义和使用类123类的基础4运算符重载模块中的类655.1理解Python的面向对象Python的面向对象技术支持类、对象实例、继承、重载、多态等面向对象特点,但与C++、Java等支持的面向对象又有所不同。本节主要讲述:–Python的类–Python中的对象5.1.1Python的类•类使用class语句来定义•在类中,用赋值语句创建变量,用def定义函数•Python的类具有下列几个主要特点。–类定义了新的命名空间,类中的变量和函数的作用域就是类的命名空间。–类是对象的工程。一个类可以有多个实例对象,每个实例对象拥有自己的命名空间。–类支持继承,通过继承对类进行扩展。–支持运算符重载。通过内置的特定方法,可以使类的对象支持内置类型的各种运算。–在Python3.X中,类是一种数据类型,是内置的type类的实例对象。5.1.2Python中的对象•在Python的对象模型中,有两种对象:类对象和实例对象。•类对象是在执行class语句时创建的,而实例对象是在调用类的时候创建的。•每调用一次类,便创建一个实例对象。•类对象只有一个,而实例对象可以有多个。•类对象和每个实例对象都分别拥有自己的命名空间,在各自的命名空间内存储属于自己的数据。1.类对象•Python执行class语句时创建一个类对象和一个变量(名称就是类名称),变量引用类对象。与def类似,class也是可执行语句。导入类模块时,class语句被执行,创建类对象。•类中的赋值语句创建的变量是类的数据属性。与模块类似,类中的顶层赋值语句创建的变量才属于类对象。类的数据数据用“对象名.属性名”格式来访问。•类中的def语句定义的函数是类的方法属性,用“对象名.方法名()”格式来访问。•类的数据和方法由所有的实例对象共享2.实例对象•实例对象通过调用类对象来创建(就像调用函数一样来调用类对象)。•每个实例对象继承类对象的属性,并获得自己的命名空间。•实例对象的“私有”属性。类的方法函数的第一个参数默认为self,表示引用方法的对象实例。在方法中对self的属性赋值才会创建属于实例对象的属性。5.2定义和使用类与C++、Java等相比,Python提供了更简洁的办法来定义和使用类。本节主要讲述:–定义类–使用类5.2.1定义类5.2.2使用类•class语句执行后,类对象即被创建,便可进一步使用类对象来访问类的属性、创建实例对象。例如:•类的方法通常不能通过类对象直接调用,因为方法的第一个参数为self,它代表实例对象,只能通过实例对象来调用方法。例如:•在类顶层的赋值语句“data=100”定义了类对象的属性data,该属性可与实例对象共享。例如:5.3对象的属性和方法在Python中,总是通过变量名来引用各种对象。从面向对象的角度,引用各种数据对象的变量名称为属性,引用表示对象行为的函数对象的变量名称为方法。有时也会使用属性的通指表示数据的变量和表示行为的函数。本节主要讲述:–对象的属性–对象的方法–类的“伪私有”属性和方法–构造函数和析构函数5.3.1对象的属性•在Python中,实例对象继承了类对象的所有属性和方法,可以用dir()函数来查看对象的属性和方法。1.共享属性•类对象的数据属性是全局的,即默认情况下它属于类对象,并可通过实例变量来引用。2.实例对象的“私有”属性•实例对象的“私有”属性指类的函数中以“self.属性名=值”格式进行赋值创建的属性。•“私有”强调属性只属于当前实例对象,对其他实例对象而言是不可见的。•实例对象一开始是“空”的,只有在调用了类对象的方法后,才会通过其中的赋值语句创建“私有”属性。3.对象的属性是动态的•Python总是在第一次给变量赋值时创建变量。对于类对象或实例对象而言,当给不存在的属性赋值时,Python为其创建属性。5.3.2对象的方法•实例对象没有自己的方法,只是通过继承的方法名变量来引用属于类对象的方法(函数对象)。•在使用“实例对象名.方法名()”格式访问对象方法时,Python会根据继承关系去搜索引用的函数对象。如果有多级继承,则会逐级从下到上进行搜索。Python也将对象之间的继承关系结构称为对象树。在后面的内容中将进一步学习类的继承。•在Python的对象模型中,需要注意一个特殊现象是:通过实例对象调用方法时,当前实例对象作为一个参数传递给方法。所以在定义方法时,如果方法是通过实例对象来调用,通常第一个参数名称为self。使用self只是惯例,重要的是位置,完全可以用其他的名称来代替self。5.3.3类的“伪私有”属性和方法•在模块中用双下划线作为变量名前缀,可以避免变量在使用from…import*语句时被导入。•类似,可以在类中可以使用双下划线作为变量名前缀,这些变量名不能直接在类外使用。5.3.4构造函数和析构函数•类的构造函数和析构函数名称由Python预设的,__init__为构造函数名,__del__为析构函数名。•构造函数在调用类创建实例对象时自动被调用,完成对实例对象的初始化。析构函数在实例对象被回收时调用。在定义类时,可以不定义构造函数和析构函数。5.4类的继承通过继承,新类可以获得现有类的属性和方法。新类可以称作子类或派生类,被继承的现有类称作父类或超类。在新类中,可以定义新的属性和方法,从而完成对超类的扩展。本节主要讲述:–简单继承–定义子类的属性和方法–调用超类的构造函数–多重继承5.4.1简单继承•通过继承来定义新类的基本格式如下:5.4.2定义子类的属性和方法•Python允许在子类中定义自己的属性和方法。•如果子类定义的属性和方法与父类的属性和方法同名,则子类实例对象调用子类中定义的属性和方法。5.4.3用超类的构造函数•在使用构造函数对实例对象进行初始化时,可以在子类的构造函数中调用超类的构造函数。•supper用于在子类作用引用操作。5.4.4多重继承•多重继承指子类可以同时继承多个超类。•如果超类中存在同名的属性或方法,Python按照从左到右的顺序在超类中搜索方法。5.5运算符的重载运算符重载是通过实现特定的方法是类的实例对象支持Python的各种内置操作。表5-1列出了部分运算符重载方法。重载运算符就是在类中定义相应的方法,当使用实例对象执行相关运算时,则调用对应方法。本节主要讲述:–加法运算重载–索引和分片重载–自定义迭代器对象–定制对象的字符串形式5.5.1加法运算符重载•加法运算通过实现__add__方法来完成重载,当两个实例对象执行加法运算时,自动调用__add__方法。5.5.2索引和分片重载•与索引和分片有关的重载方法包括:–__getitem__–__setitem__–__delitem__1.__getitem__方法•在对实例对象执行索引、分片或for迭代时,调用__getitem__方法。2.__setitem__方法•在通过赋值语句给索引或分片赋值时,调用__setitem__方法,实现对序列对象的修改。3.__delitem__方法•__delitem__方法重载del运算,即删除索引或分片。5.5.3自定义迭代器对象•实现了__getitem__方法的实例对象可用于for循环迭代。•Python在执行迭代操作时,总是优先调用__iter__方法,若没有才调用__getitem__方法。•__iter__方法返回一个迭代器对象,然后Python可重复调用迭代器对象的__next__执行迭代操作,直到发生StopIteration异常。•Python的内置函数next()本质上时通过调用的对象的__next__方法来完成。1.迭代器对象只能使用一次•默认情况下,自定义的迭代器对象只能使用一次,迭代完成后,必须创建新的迭代器对象才可开始新的迭代操作。2.有多个迭代器的对象•map和zip函数生成的对象时单迭代对象;而range、set、list等其他的内置函数生成的对象,则支持多个迭代器。•单迭代器和多迭代器与实现__iter__方法的方式有关。•若在__iter__方法直接返回了self对象,即保持了迭代器对象状态。当迭代结束,再次返回迭代器对象时,得到的是已迭代结束的迭代器对象。•如果要得到新的迭代器,在__iter__方法中先恢复迭代器到初始状态即可。5.5.4定制对象的字符串形式•重载__repr_和__str__方法可定义对象转换为字符串的形式。在执行print()、str()、repr()以及交互模式下直接显示对象时,会调用__repr_或__str__方法。1.只重载__str__方法•如果只重载了__str__方法,只有str()和print()函数可调用__str__方法进行转换。2.只重载__repr__方法•重载__repr__方法,可以保证各种操作下都能将正确获得实例对象的自定义的字符串形式。3.同时重载__str__和__repr__方法•如果同时重载了__str__和__repr__方法,则str()和print()函数调用__str__方法,交互模式下直接显示对象和repr()函数调用__repr__方法。5.6模块中的类可以将模块中的类导入到当前模块使用。导入的类是模块对象的一个属性,就像模块中的函数一样,可以像调用模块函数一样来调用类对象。本节主要讲述:–使用模块中的类本章完

1 / 62
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功