内容正文:
项目八 类与对象
Contents
类的定义和创建实例
类中属性和方法
构造方法和析构方法
类的定义
PART 01
根据操作数据的函数或语句块来设计程序的,称为面向过程的编程。
面向对象编程——Object Oriented Programming,简称OOP,是一种程序设计思想。OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数。
在Python中,所有数据类型都可以视为对象,当然也可以自定义对象。自定义的对象数据类型就是面向对象中的类(Class)的概念。
面向对象
4
类和对象的关系即数据类型与变量的关系
根据一个类可以创建多个对象,而只能是某一个类的对象。
类规定了可以用于存储什么数据,而对象用于每个对象实际存储数据,每个对象可存储不同的数据。
类与对象
5
例如,有一个学生类,其中包括学号和姓名两个属性,则根据学生类可以创建多个学生对象,每个学生对象可以具有不同的学号和姓名信息。
类与对象
6
在一个类中,包含属性和各种方法
属性对应一个类可以用来保存哪些数据
方法对应一个类可以支持哪些操作(即数据处理)
类的定义形式多样
可以直接创建新的类
也可以基于一个或多个已有的类创建新的类
可以创建一个空的类,然后再动态添加属性和方法
也可以在创建类的同时设置属性和方法
类的定义
7
class 类名:
语句1
语句2
……
语句N
类的定义形式如下所示:
1 class Student: #定义一个名字为Student的类
2 pass #一个空语句,起到占位作用,表示Student类中没有任何属性和方法
下面是一个最简单的类的定义方法,即定义一个空类。
类的定义
代码缩进 4个空格
正文缩进1.27厘米
8
创建实例
PART 02
创建实例
【任务描述】
创建一个类
根据类创建一个实例
【关键步骤】
创建一个类
根据类创建一个实例
示例01
代码缩进 4个空格
正文缩进1.27厘米
10
类名(参数表)
定义了一个类后,就可以创建该类的实例对象,其语法格式如下所示:
1 class Student: #定义一个名字为Student的类
2 pass #一个空语句,起到占位作用,表示Student类中没有任何属性和方法
3 if __name__=='__main__':
4 stu=Student() #创建Student类的对象,并将创建的对象赋给变量stu
5 print(stu) #输出stu
其中,参数表是指创建对象时传入的参数。下面给出不传递参数情况下创建对象的程序示例
程序执行完毕后,将在屏幕上输出如下结果:
<__main__.Student object at 0x00000216EE7DF0F0>
从输出结果中可以看到,stu是Student类的对象,其地址为0x00000216EE7DF0F0。
创建实例
示例01
代码缩进 4个空格
正文缩进1.27厘米
11
类属性和普通方法的定义及其访问
PART 03
1 class Student: #定义Student类
2 name='Unknown' #定义Student类中有一个name属性
属性即对应一个类对象可以保存的数据。可以直接在定义类时指定该类的属性,即类属性。
类名或对象名.属性名
对类属性的访问,既可以直接通过类名访问,也可以通过该类的对象访问
类属性定义及其访问
代码缩进 4个空格
正文缩进1.27厘米
13
类属性定义及其访问
【任务描述】
了解类属性定义及其访问
【关键步骤】
了解类属性定义及其访问
示例02
代码缩进 4个空格
正文缩进1.27厘米
14
1 class Student: #定义Student类
2 name='Unknown' #定义Student类中有一个name属性
3 if __name__=='__main__':
4 print('第4行输出:',Student.name)
5 stu1=Student() #创建Student类对象stu1
6 stu2=Student() #创建Student类对象stu2
7 print('第7行输出:stu1 %s,stu2 %s'%(stu1.name,stu2.name))
8 Student.name='未知' #将Student的类属性name赋为“未知”
9 print('第9行输出:',Student.name)
10 print('第10行输出:stu1 %s,stu2 %s'%(stu1.name,stu2.name))
11 stu1.name='李晓明' #将stu1的name属性赋值为“李晓明”
12 stu2.name='马红' #将stu2的name属性赋值为“马红”
13 print('第13行输出:',Student.name)
14 print('第14行输出:stu1 %s,stu2 %s'%(stu1.name,stu2.name))
15 Student.name='学生' #将Student的类属性name赋为“学生”
16 print('第16行输出:',Student.name)
17 print('第17行输出:stu1 %s,stu2 %s'%(stu1.name,stu2.name))
类属性的访问示例
类属性定义及其访问
示例02
代码缩进 4个空格
正文缩进1.27厘米
15
执行程序后,则在屏幕上会输出如下结果:
第4行输出: Unknown
第7行输出:stu1 Unknown,stu2 Unknown
第9行输出: 未知
第10行输出:stu1 未知,stu2 未知
第13行输出: 未知
第14行输出:stu1 李晓明,stu2 马红
第16行输出: 学生
第17行输出:stu1 李晓明,stu2 马红
类属性定义及其访问
示例02
代码缩进 4个空格
正文缩进1.27厘米
16
1 class Student: #定义Student类
2 name='Unknown' #定义Student类中有一个name属性
3 if __name__=='__main__':
4 stu1=Student() #定义Student类对象stu1
5 stu2=Student() #定义Student类对象stu2
6 stu1.age=19 #为对象stu1动态绑定新的属性age
7 print('stu1姓名:%s,年龄:%d'%(stu1.name,stu1.age)) #输出姓名和年龄
8 #print('stu2年龄:'%stu2.age) #取消注释则该语句会报错
9 #print('使用类名访问年龄属性:'%Student.age) #取消注释则该语句会报错
Python作为一种动态语言,除了可以在定义类时指定类属性外,还可以动态地为已经创建的对象绑定新的属性。
执行程序后,则在屏幕上会输出如下结果:
姓名:Unknown,年龄:19
类属性定义及其访问
示例02
代码缩进 4个空格
正文缩进1.27厘米
17
类中的方法实际上就是执行某种数据处理功能的函数。
与普通函数定义一样,类中的方法在定义时也需要使用def 关键字。
类中的方法分为两类:普通方法和内置方法
普通方法需要通过类的实例对象根据方法名调用
内置方法是在特定情况下由系统自动执行
类中普通方法定义及调用
18
实例对象名.方法名(实参列表)
在定义类的普通方法时,第一个参数需要对应调用方法时所使用的实例对象(一般命名为self,但也可以改为其他名字)。当使用一个实例对象调用类的普通方法时,其语法格式为:
类中普通方法定义及调用
代码缩进 4个空格
正文缩进1.27厘米
19
类中普通方法定义及调用
【任务描述】
了解类中普通方法定义及调用
【关键步骤】
了解类中普通方法定义及调用
示例03
代码缩进 4个空格
正文缩进1.27厘米
20
1 class Student: #定义Student类
2 name='Unknown' #定义Student类中有一个name属性
3 def SetName(self, newname): #定义类的普通方法SetName
4 self.name=newname #将self对应实例对象中的name属性值赋为newname
5 def PrintName(self): #定义类的普通方法PrintName
6 print('姓名:%s'%self.name) #输出self对应实例对象中的name属性值
7 if __name__=='__main__':
8 stu1=Student() #定义Student类对象stu1
9 stu2=Student() #定义Student类对象stu2
10 stu1.SetName('李晓明') #通过stu1对象调用SetName方法
11 stu2.SetName('马红') #通过stu1对象调用SetName方法
12 stu1.PrintName() #通过stu1对象调用PrintName方法
13 stu2.PrintName() #通过stu2对象调用PrintName方法
14 #Student.SetName('未知') #取消前面的注释,则会有系统报错信息
15 #Student.PrintName() #取消前面的注释,则会有系统报错信息
在通过类的实例对象调用类中的普通方法时,并不需要传入self参数的值,self会自动对应调用该方法时所使用的对象。
类中普通方法定义及调用
示例03
代码缩进 4个空格
正文缩进1.27厘米
21
私有属性
PART 04
私有属性
【任务描述】
了解私有属性定义及调用
【关键步骤】
了解私有属性定义及调用
示例04
代码缩进 4个空格
正文缩进1.27厘米
23
1 class Student: #定义Student类
2 name='未知' #定义Student类中有一个name属性
3 __id='未知' #定义Student类中有一个__id私有属性
4 def SetInfo(self,newname,newid): #定义SetInfo函数
5 self.name=newname #将self对应实例对象的name属性赋为newname
6 self.__id=newid #将self对应实例对象的__id属性赋为newid
7 def PrintInfo(self): #定义PrintInfo函数
8 print('姓名:%s,身份证号:%s'%(self.name,self.__id))
7 if __name__=='__main__':
8 stu=Student() #定义Student类对象stu
9 stu.SetInfo('李晓明','120XXXXXXXXXXXXXXX') #通过stu调用SetInfo方法
10 stu.PrintInfo() #通过stu对象调用PrintInfo方法
11 #print('身份证号:%s'%stu.__id) #取消前面的注释,则程序会报错
私有属性,是指在类内可以直接访问、而在类外无法直接访问的属性。私有属性名是以__(两个下划线)开头。
私有属性
示例04
代码缩进 4个空格
正文缩进1.27厘米
24
构造方法和析构方法
PART 03
构造方法与析构方法
【任务描述】
了解构造方法定义及调用
了解析构方法定义及调用
【关键步骤】
了解构造方法定义及调用
了解析构方法定义及调用
示例05
代码缩进 4个空格
正文缩进1.27厘米
26
1 class Student: #定义Student类
2 def __init__(self): #定义构造方法
3 print('构造方法被调用!')
4 self.name='未知' #将self对应对象的name属性赋值为“未知”
5 def PrintInfo(self): #定义普通方法PrintInfo
6 print('姓名:%s'%self.name) #输出姓名信息
7 if __name__=='__main__':
8 stu=Student() #创建Student类对象stu,自动执行构造方法
9 stu.PrintInfo() #通过stu对象调用PrintInfo方法
构造方法是Python类中的内置方法之一,它的方法名为__init__,在创建一个类对象时会自动执行,负责完成新创建对象的初始化工作。
执行程序后,则在屏幕上会输出:
构造方法被调用!
姓名:未知
构造方法与析构方法
示例05
代码缩进 4个空格
正文缩进1.27厘米
27
1 class Student: #定义Student类
2 def __init__(self,name): #定义构造方法
3 print('构造方法被调用!')
4 self.name=name #将self对应对象的name属性赋为形参name的值
5 def PrintInfo(self): #定义普通方法PrintInfo
6 print('姓名:%s'%self.name) #输出姓名信息
7 if __name__=='__main__':
8 stu=Student('李晓明') #创建Student类对象stu,自动执行构造方法
9 stu.PrintInfo() #通过stu对象调用PrintInfo方法
构造方法中,除了self,也可以设置其他参数。
执行程序后,则在屏幕上会输出:
构造方法被调用!
姓名:李晓明
构造方法与析构方法
示例05
代码缩进 4个空格
正文缩进1.27厘米
28
1 class Student: #定义Student类
2 def __init__(self,name='未知'): #定义构造方法
3 print('构造方法被调用!')
4 self.name=name #将self对应对象的name属性赋为形参name的值
5 def PrintInfo(self): #定义普通方法PrintInfo
6 print('姓名:%s'%self.name) #输出姓名信息
7 if __name__=='__main__':
8 stu1=Student() #创建Student类对象stu1,自动执行构造方法
9 stu2=Student('李晓明') #创建Student类对象stu2,自动执行构造方法
10 stu1.PrintInfo() #通过stu1对象调用PrintInfo方法
11 stu2.PrintInfo() #通过stu1对象调用PrintInfo方法
另外,构造方法也可以设置默认参数。
执行程序后,则在屏幕上会输出:
构造方法被调用!
构造方法被调用!
姓名:未知
姓名:李晓明
构造方法与析构方法
示例05
代码缩进 4个空格
正文缩进1.27厘米
29
1 class Student: #定义Student类
2 def __init__(self,name): #定义构造方法
3 self.name=name #将self对应对象的name属性赋值为形参name的值
4 print('姓名为%s的对象被创建!'%self.name)
5 def __del__(self): #定义析构方法
6 print('姓名为%s的对象被销毁!'%self.name)
7 def func(name):
8 stu=Student(name) #创建Student类对象stu
9 if __name__=='__main__':
10 stu1=Student('李晓明') #创建Student类对象stu1
11 stu2=Student('马红') #创建Student类对象stu2
12 del stu2 #使用del删除stu2对象
13 func('张刚') #调用func函数
析构方法是类的另一个内置方法,它的方法名为__del__,在销毁一个类对象时会自动执行,负责完成待销毁对象的资源清理工作,如关闭文件等。
构造方法与析构方法
示例05
代码缩进 4个空格
正文缩进1.27厘米
30
执行程序后,则在屏幕上会输出:
姓名为李晓明的对象被创建!
姓名为马红的对象被创建!
姓名为马红的对象被销毁!
姓名为张刚的对象被创建!
姓名为张刚的对象被销毁!
构造方法与析构方法
示例05
代码缩进 4个空格
正文缩进1.27厘米
31
常用内置方法
PART 06
常用内置方法
【任务描述】
了解__str__定义及调用
了解比较运算的内置方法
【关键步骤】
了解__str__定义及调用
了解比较运算的内置方法
示例06
代码缩进 4个空格
正文缩进1.27厘米
33
1 class Complex: #定义复数类Complex
2 def __init__(self,real,image): #定义构造方法
3 self.real=real #将self对应对象的real属性赋值为形参real的值
4 self.image=image #将self对应对象的image属性赋值为形参image的值
5 def __str__(self): #定义内置方法__str__
6 return str(self.real)+'+'+str(self.image)+'i'
7 if __name__=='__main__':
8 c=Complex(3.2,5.3) #定义Complex类对象c
9 print(c) #输出c
调用str函数对类对象进行处理时或者调用Python内置函数format()和print()时自动执行,__str__方法的返回值必须是字符串。
执行程序后,则在屏幕上会输出:
3.2+5.3i
__str__
代码缩进 4个空格
正文缩进1.27厘米
34
内置方法 功能描述
__gt__(self, other) 进行self>other运算时自动执行
__lt__(self, other) 进行self<other运算时自动执行
__ge__(self, other) 进行self>=other运算时自动执行
__le__(self, other) 进行self<=other运算时自动执行
__eq__(self, other) 进行self==other运算时自动执行
__ne__(self, other) 进行self!=other运算时自动执行
比较运算的内置方法
代码缩进 4个空格
正文缩进1.27厘米
35
1 class Student: #定义Student类
2 def __init__(self, name, age): #定义构造方法
3 self.name=name #将self对应对象的name属性赋为形参name的值
4 self.age=age #将self对应对象的age属性赋为形参age的值
5 def __gt__(self, other): #定义内置方法__gt__
6 return self.age>other.age
7 def __ne__(self, other): #定义内置方法__ne__
8 return self.age!=other.age
9 def __le__(self, other): #定义内置方法__le__
10 return self.age<=other.age
11 if __name__=='__main__':
12 stu1=Student('李晓明',19) #定义Student类对象stu1
13 stu2=Student('马红',20) #定义Student类对象stu2
14 stu3=Student('张刚',19) #定义Student类对象stu3
15 print('马红的年龄小于等于李晓明的年龄:', stu2<=stu1)
16 print('张刚的年龄小于等于李晓明的年龄:', stu3<=stu1)
17 print('马红的年龄大于李晓明的年龄:', stu2>stu1)
18 print('张刚的年龄大于李晓明的年龄:', stu3>stu1)
19 print('张刚的年龄不等于李晓明的年龄:', stu3!=stu1)
20 print('张刚的年龄不等于马红的年龄:', stu3!=stu2)
比较运算的内置方法
代码缩进 4个空格
正文缩进1.27厘米
36
执行程序后,则在屏幕上会输出如下结果:
马红的年龄小于等于李晓明的年龄: False
张刚的年龄小于等于李晓明的年龄: True
马红的年龄大于李晓明的年龄: True
张刚的年龄大于李晓明的年龄: False
张刚的年龄不等于李晓明的年龄: False
张刚的年龄不等于马红的年龄: True
比较运算的内置方法
37
面向对象编程——Object Oriented Programming,简称OOP,是一种程序设计思想。OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数。在Python中,所有数据类型都可以视为对象,当然也可以自定义对象。自定义的对象数据类型就是面向对象中的类(Class)的概念。由于Python是动态语言,根据类创建的实例可以任意绑定属性。
打印实例输出属性值
任务背景
任务01
打印实例输出属性值
掌握Python中类的定义方式以及__repr__内置函数的作用
任务需求
任务分析
建立Python项目
定义一个Person类
创建该类的两个实例
打印实例的属性
任务01
借用Pycharm工具,建立Python3项目
定义一个Person类
创建该类的两个实例
打印实例的属性
打印实例输出属性值
任务步骤
任务结果
定义两个实例,并打印他们的属性值name
任务01
谢谢观看
$$