Python程序设计基础-教学课件 第8章 面向对象程序设计_第1页
Python程序设计基础-教学课件 第8章 面向对象程序设计_第2页
Python程序设计基础-教学课件 第8章 面向对象程序设计_第3页
Python程序设计基础-教学课件 第8章 面向对象程序设计_第4页
Python程序设计基础-教学课件 第8章 面向对象程序设计_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

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

文档简介

第8章

面向对象程序设计目录8.1类与对象8.2类的成员8.48.58.7类的继承8.38.68.8成员可见性特殊方法封装多态运算符重载8.1类与对象类和对象的关系即为数据类型与变量的关系,根据一个类可以创建多个对象,而每个对象只能是某一个类的对象。类规定了可以用于存储什么类型数据,而对象用于实际存储数据,每个对象可存储不同的数据,数据即属性。例如,有一个教师类,其中包括教师工号和姓名两个属性,则根据教师类可以创建多个教师对象,每个教师对象可以具有不同的教师工号和姓名信息。

8.1.1类的定义在一个类中,除了可以包含前面所说的属性,还可以包含各种方法。属性对应一个类可以用来保存哪些数据,而方法对应一个类可以支持哪些操作(即数据处理)。类中的属性对应前面所学习的变量,而类中的方法对应前面所学习的函数。通过类,可以把数据和操作封装在一起,从而使得程序结构更加清晰,这也就是所谓类的封装性。类的语法格式如下所示:

class类名:

属性名=属性值

def方法名(self):

方法体

8.1.2对象的创建与使用

对象可以是人们要进行研究的任何事物,从最简单的整数到复杂的飞机等均可看作对象,它不仅能表示具体的事物,还能表示抽象的规则,计划或事件;它能够直接反映现实生活中的事物,例如人、车、小鸟等。根据类创建对象的语法格式如下:对象名=类名()【例8-2】创建教师类Teacher对象示例。teacher=Teacher()

对象的使用本质上就是对类或对象成员的使用,即访问属性或调用方法。访问属性或调用方法的语法格式如下所示:

对象名.属性名

对象名.方法名()

8.2类的成员——属性属性是类的成员之一,它是类的实例的状态。属性按照声明的方式分为类属性和实例属性两种。(1)类属性类属性是声明在类内部、方法外部的属性。类属性可以通过类和对象进行访问,但只能通过类进行修改。8.2类的成员——属性(2)实例属性实例属性是在方法内部声明的属性,Python支持动态添加实例属性。下面从访问实例属性、修改实例属性和动态添加实例属性3个方面对实例属性进行介绍。1)访问实例属性实例属性只能通过对象进行访问。【例8-5】访问实例属性示例。classTeacher:department="SoftwareEngineering"defplace(self):self.address="Liaoning"#添加实例对象

teacher=Teacher()teacher.place()print(teacher.address)print(Teacher.address)运行结果:Liaoning---------------------------------------------------------------------------------AttributeErrorTraceback(mostrecentcalllast)<ipython-input-2-f62de8e93d45>in<module>

7teacher.place()

8print(teacher.address)---->9

print(Teacher.address)AttributeError:typeobject'Teacher'hasnoattribute'address'8.2类的成员——属性2)修改实例属性实例属性通过对象进行修改。【例8-6】修改实例属性示例。classTeacher:department="SoftwareEngineering"defplace(self):self.address="Liaoning"#添加实例对象

teacher=Teacher()teacher.place()teacher.address="Shandong"print(teacher.address)运行结果:Shandong8.2类的成员——属性3)动态添加实例属性Python支持在类的外部使用对象动态地添加实例属性。【例8-7】动态添加实例属性示例。classTeacher:department="SoftwareEngineering"defplace(self):self.hometown="Liaoning"#添加实例属性

teacher=Teacher()teacher.place()="Lidan"#添加实例属性teacher.age=35#添加实例属性

print(f"该教师名字为:{}")print(f"该教师年龄为:{teacher.age}")print(f"该教师籍贯为:{teacher.hometown}")print(f"该教师所在的系为:{teacher.department}")运行结果:该教师名字为:Lidan该教师年龄为:35该教师籍贯为:Liaoning该教师所在的系为:SoftwareEngineering8.2类的成员——方法Python中的方法按定义方式和用途可以分为三类:实例方法、类方法和静态方法。(1)实例方法实例方法是类中定义的函数,它们的第一个参数通常是“self”,表示对类的实例对象的引用。实例方法可以访问并操作类的属性和方法,只能通过对象调用。【例8-8】实例方法示例。classTeacher:department="SoftwareEngineering"defplace(self):#定义实例方法

self.hometown="Liaoning"print("我是实例方法")print(self.hometown)

teacher=Teacher()teacher.place()Teacher.place()运行结果:我是实例方法Liaoning----------------------------------------------------------------------------------TypeErrorTraceback(mostrecentcalllast)<ipython-input-7-d4f1d0055d0c>in<module>

7teacher=Teacher()

8teacher.place()---->9

Teacher.place()TypeError:place()missing1requiredpositionalargument:'self'8.2类的成员——方法(2)类方法类方法是指定义在类内部,使用装饰器@classmethod修饰的方法。类方法的语法格式如下所示:

@classmethoddef类方法名(cls):方法体类方法中的参数列表的第一个参数为cls,代表类本身(类似于实例方法中的self),它会在类方法被调用时自动接收由系统传递的调用该方法的类。类方法可以通过类和对象调用。8.2类的成员——方法(3)静态方法静态方法是定义在类内部,使用装饰器@staticmethod修饰的方法。与类方法相比,静态方法没有任何默认参数,它适用于与类无关的操作,或者无需使用类成员的操作。【例8-11】静态方法示例。classTeacher:department="SoftwareEngineering"@staticmethoddefplace():#定义静态方法

print("我是静态方法")

teacher=Teacher()teacher.place()#通过对象调用静态方法Teacher.place()#通过类调用静态方法

运行结果:我是静态方法我是静态方法Python

中没有关键字去修饰成员,默认

Python

中所有的成员都是公有成员,可以在类的外部通过类或对象随意访问。8.3成员可见性——公有成员【例8-13】公有成员示例。classStudent:address='辽宁'#属性stu=Student()#实例对象print(Student.address)#通过类访问属性并输出print(stu.address)#通过实例对象访问属性并输出运行结果:辽宁辽宁结果分析:此代码定义一个Student类,接着定义一个属性address,创建对象stu。从以上结果可以看出,类的公有成员属性可以在类的外部通过类或对象随意访问。根据公有成员在安全上的局限性,为保证类中数据的安全,Python

支持将公有成员改成私有成员,在一定程度上限制在类的外部对类的访问。Python

通过在类成员的名称前面添加上双下划线(__)的方式来表示私有成员,语法格式如下所示:__属性名__方法名8.3成员可见性——私有成员在

Python

中,类的保护成员是指以一个下划线开头的成员变量或方法,例如

_address、_getschool()

。受保护的成员可以在类的内部和子类中访问,但是在类的外部不应该直接访问。8.3成员可见性——保护成员【例8-16】保护成员示例。classStudent:_address="辽宁"def_getschool(self):print("我在"+self._address+"上大学")stu=Student()

stu._getschool()#访问保护型方法print(stu._address)

#访问保护型属性运行结果:我在辽宁上大学辽宁Python

中,类的构造方法为

__init__()

方法,创建对象时系统自动调用,负责在创建对象时对对象进行初始化。每个类默认都有一个

__init__()

方法,可以在类中显式定义

__init__()

方法。__init__()

方法可以分为无参构造方法和有参构造方法。8.4.1构造方法当使用无参构造方法创建对象时,所有对象的属性都有相同的初始值。1当使用有参构造方法常见对象时,所有对象的属性可以有不同的初始值。28.4.1构造方法【例8-17】无参构造方法示例。classStudent:def__init__(self):="张三"defeat(self):print(f'{}在吃饭')stu_one=Student()stu_one.eat()stu_two=Student()stu_two.eat()运行结果:张三在吃饭张三在吃饭【例8-18】有参构造方法示例。classStudent:def__init__(self,name):=namedefeat(self):print(f'{}在吃饭')stu_one=Student("张三")stu_one.eat()stu_two=Student("李四")stu_two.eat()运行结果:张三在吃饭李四在吃饭8.4.2析构方法

析构方法是类的另一个内置方法,其方法名为

__del__()

,在销毁一个对象时系统自动调用的方法,负责完成待销毁对象的资源清理工作,如关闭文件等。每个类默认都有一个

__del__()

方法,也可以显式定义析构方法。【例8-19】析构方法示例。classStudent:def__init__(self,name):#定义构造方法

=nameprint(f"姓名为{}的对象被创建!")def__del__(self):#定义析构方法

print(f"姓名为{}的对象被销毁!")

deffunc(name):stu=Student(name)#创建Student类对象stu

stu_one=Student("张三")#创建Student类对象stu_onestu_two=Student("李四")#创建Student类对象stu_twostu_three=stu_twodelstu_two#使用del删除对象stu_twofunc("吴六")#调用func函数delstu_three#使用del删除对象stu_threestu_four=Student("刘七")运行结果:姓名为张三的对象被创建!姓名为李四的对象被创建!姓名为吴六的对象被创建!姓名为吴六的对象被销毁!姓名为李四的对象被销毁!姓名为刘七的对象被创建!8.5

封装

封装是面向对象的重要特性之一,它的基本思想是对外隐藏类的细节,将数据和方法封装在一个单独的类中,使得外部无法直接访问和修改数据,只能通过类的方法来访问和修改数据。封装的目的是隐藏类的内部实现细节,使得类的用户只需要关心类提供的公共接口,而不关心类的内部实现,这在一定程度上保证了类内数据的安全。为了契合封装思想,在定义类时需要满足以下两点要求。添加两类供外界调用的公有方法,分别用于设置或获取私有属性的值。将类属性声明为私有属性。02018.6类的继承——单继承

在类层次中,子类只继承一个父类的数据结构和方法,称为单继承,即子类只继承一个父类。现实生活中,蝴蝶犬、贵妇犬、边牧犬都属于狗类,它们之间存在的继承关系即为单继承。Python中单继承的语法格式如下所示:class子类名(父类名)子类继承父类的同时会自动拥有父类的公有方法和属性。若在定义时没有指明该类的父类,那么该类自动继承object类。8.6类的继承——多继承

现实生活中很多事物是多个事物的组合,让他们同时具有多个实物的特征或行为,例如房车是房屋和汽车的组合,既具有房屋的居住行为,也具有汽车的行驶行为。玩具车是玩具和车的组合,既有玩具的特性也有车的特征。

在类层次中,子类继承了多个父亲的数据结构和方法,称为多继承。程序中的一个类可以继承多个类,即子类具有多个父类,也自动拥有所有父类的公有成员。Python中多继承的语法格式如下所示:class子类名(父类名1,父类名2,…):8.6类的继承——重写在子类中定义与父类方法同名的方法,在方法中按照子类需求重新编写功能代码即可。【例8-25】重写示例。classAnimal:defmake_sound(self):print("Animalmakessound")

classDog(Animal):defmake_sound(self):#重写的方法

print("Dogbarks")

#使用示例animal=Animal()animal.make_sound()dog=Dog()dog.make_sound()#子类调用了重写的方法运行结果:AnimalmakessoundDogbarks重写的目的是为了实现多态(Polymorphism),即同样的方法名可以在不同的类中实现不同的行为。通过重写,可以在子类中实现与父类中同名的方法,以实现不同的行为,从而实现多态。8.7

多态多态是面向对象的重要特性之一,它的直接表现即让不同类的同一功能可以通过同一个接口调用,表现出不同的行为。【例8-27】多态示例。classAnimal(object):defeat(self):print('动物会吃')classDog(Animal):defeat(self):print('狗吃骨头')classCat(Animal):defeat(self):print('猫吃鱼')classPerson:defeat(self):print('人吃五谷杂粮')deffun(obj):obj.eat()fun(Animal())fun(Dog())fun(Cat())fun(Person())运行结果:动物会吃狗吃骨头猫吃鱼人吃五谷杂粮此代码定义一个动物类Animal,猫类Cat和狗类Dog都继承动物类Animal,定义一个人类Person,为这四个类都定义一个方法eat(),接着定义一个函数,此函数通过同一个接口obj分别调用了动物类Animal、狗类Dog、猫类Cat和人类Person的eat()方法,不同的对象收到同一消息产生不同的结果,体现了面向对象的多态性。8.8运算符重载在

Python

中,可以通过在类中定义特殊方法来实现运算符重载。运算符重载是指赋予内置运算符新的功能,使内置运算符能适应更多的数据类型。在

Python

中,可以重载很多不同的运算符,例如+、-、*、/、==、<等等。每个运算符都对应一个特殊方法,可以在类中定义这些特殊方法来重载对应的运算符。下面是一些常用的运算符及其对应的特殊方法:·

+

运算符对应__add__

方法:在类中定义__add__

方法来重载+

运算符,以实现加法运算。·

-

运算符对应__sub__

方法:在类中定义__sub__

方法来重载-

运算符,以实现减法运算。·

*

运算符对应__mul__

方法:在类中定义__mul__

方法来重载*

运算符,以实现乘法运算。·

/

运算符对应__truediv__

方法:在类中定义__truediv__

方法来重载/

运算符,以实现除法运算。//

运算符对应__floordiv__

方法:在类中定义__floordiv__

方法来重载//

运算符,以实现整除运算。8.8运算符重载

%运算符对应__mod__方法:在类中定义__mod__方法来重载%运算符,以实现取模运算。**运算符对应__pow__方法:在类中定义__pow__

温馨提示

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

评论

0/150

提交评论