实验7:面对对象程序设计
一、实验目的和要求
1、学会类的定义和使用;
2、学会创建属性;
3、实现类的继承。
二、实验环境
软件版本:Python 3.10 64_bit
三、实验过程
1、实例1:创建大雁类并定义飞行方法
(1)在IDLE中创建一个名称为geese.py的文件,然后在该文件中定义一个大雁类Geese,并定义一个构造方法,然后再定义一个实例方法fly(),该方法有两个参数,一个是self,另一个用于指定飞行状态,最后再创建大雁类的实例,并调用实例方法fly()。代码如下:
1 class Geese: # 创建大雁类
2 """大雁类"""
3 def __init__(self,beak,wing,claw): # 构造方法
4 print("我是大雁类!我有以下特征:")
5 print(beak) # 输出喙的特征
6 print(wing) # 输出翅膀的特征
7 print(claw) # 输出爪子的特征
8 def fly(self,state): # 定义飞行方法
9 print(state)
10 """*******************调用方法***************"""
11 beak_1 = "喙的基部较高,长度与头部的长度几乎相等" # 喙的特征
12 wing_1 = "翅膀长而尖" # 翅膀的特征
13 claw_1 = "爪子是蹼状的" # 爪子的特征
14 wildGoose = Geese(beak_1,wing_1,claw_1) # 创建大雁类的实例
15 wildGoose.fly("我飞行的时候,一会儿排成个人字,一会排成个一字") # 调用实例方法
(2)运行结果如图所示:
2、实例2:通过类属性统计类的实例个数
(1)在IDLE中创建一个名称为geese_a.py的文件,然后在该文件中定义一个雁类Geese,并在该类中定义4个类属性,前三个用于记录雁类的特征,第4个用于记录实例编号,然后定义一个构造方法,在该构造方法中将记录实例编号的类属性进行加1操作,并输出4个类属性的值,最后通过for循环创建4个雁类的实例。代码如下:
1 class Geese:
2 """雁类"""
3 neck = "脖子较长" # 类属性(脖子)
4 wing = "振翅频率高" # 类属性(翅膀)
5 leg = "腿位于身体的中心支点,行走自如" # 类属性(腿)
6 number = 0 # 编号
7 def __init__(self): # 构造方法
8 Geese.number += 1 # 将编号加1
9 print("\n我是第" + str(Geese.number) + "只大雁,我属于雁类!我有以下特征:")
10 print(Geese.neck) # 输出脖子的特征
11 print(Geese.wing) # 输出翅膀的特征
12 print(Geese.leg) # 输出腿的特征
13 # 创建4个雁类的对象(相当于有4只大雁)
14 list1 = []
15 for i in range(4): # 循环4次
16 list1.append(Geese()) # 创建一个雁类的实例
17 print("一共有" + str(Geese.number) + "只大雁")
(2)运行结果如图所示:
3、实例3:在模拟电影点播功能时应用属性
(1)在IDLE中创建一个名称为film.py的文件,然后在该文件中定义一个电视节目类TVshow,并在该类中定义一个类属性,用于保存电影列表,然后在__init__()方法中定义一个私有的实例属性,再将该属性转换为可读取、可修改(有条件进行)的属性,最后创建类的实例,并获取和修改属性值。代码如下:
1 class TVshow:
2 list_film = ["战狼2","红海行动","西游记女儿国","熊出没•变形记"]
3 def __init__(self,show):
4 self.__show = show
5 @property
6 def show(self):
7 return self.__show
8 @show.setter
9 def show(self,value):
10 if value in TVshow.list_film:
11 self.__show = "您选择了《" + value + "》,稍后将播放"
12 else:
13 self.__show = "您点播的电影不存在"
14 tvshow = TVshow("战狼2")
15 print("正在播放:《",tvshow.show,"》")
16 print("您可以从",tvshow.list_film,"中选择要点播放的电影")
17 tvshow.show = "红海行动"
18 print(tvshow.show)
(2)运行结果如图所示:
4、实例4:创建水果基类及其派生类
(1)在IDLE中创建一个名称为fruit.py的文件,然后在该文件中定义一个水果类Fruit(作为基类),并在该类中定义一个类属性(用于保存水果默认的颜色)和一个harvest()方法,然后创建Apple类和Orange类,都继承自Fruit类,最后创建Apple类和Orange类,都继承自Fruit类,最后创建Apple类和Orange类的实例,并调用harvest()方法(在基类中编写)。代码如下:
1 class Fruit:
2 color = "绿色"
3 def harvest(self,color):
4 print("水果是:" + color + "的!")
5 print("水果已经收获……")
6 print("水果原来是:" + Fruit.color + "的!")
7 class Apple(Fruit):
8 color = "红色"
9 def __init__(self):
10 print("我是苹果")
11 class Orange(Fruit):
12 color = "橙色"
13 def __init__(self):
14 print("我是橘子")
15 apple = Apple()
16 apple.harvest(apple.color)
17 orange = Orange()
18 orange.harvest(orange.color)
(2)运行结果如图所示:
5、实例5:在派生类中调用基类的__init__()方法定义类属性
(1)在IDLE中创建一个名称为fruit_a.py的文件,然后在该文件中定义一个水果类Fruit(作为基类),并在该类中定义__init__()方法,在该方法中定义一个类属性(用于保存水果默认的颜色),然后在Fruit类中定义一个harvest()方法,再创建Apple类和Sapodilla类,都继承自Fruit类,最后创建Apple类和Sapodilla类的实例,并调用harvest()方法(在基类中编写)。代码如下:
1 class Fruit:
2 def __init__(self,color = "绿色"):
3 Fruit.color = color
4 def harvest(self,color):
5 print("水果是:" + self.color + "的!")
6 print("水果已经收获……")
7 print("水果原来是:" + Fruit.color + "的!")
8 class Apple(Fruit):
9 color = "红色"
10 def __init__(self):
11 print("我是苹果")
12 super().__init__()
13 class Sapodilla(Fruit):
14 def __init__(self,color):
15 print("\n我是人参果")
16 super().__init__(color)
17 # 重写harvest()方法的代码
18 def harvest(self,color):
19 print("人参果是:" + color + "的!")
20 print("人参果已经收获……")
21 print("人参果原来是:" + Fruit.color + "的!")
22 apple = Apple()
23 apple.harvest(apple.color)
24 sapodilla = Sapodilla("白色")
25 sapodilla.harvest("金黄色带紫色条纹")
(2)运行结果如图所示:
6、实战一:导演为剧本选主角
(1)智能手机的默认语言为英文,但制作手机时可以将默认语言设置为中文。编写手机类,采用无参构造方法时,表示使用默认语言设计,利用有参构造方法时,修改手机的默认语言。代码如下:
1 class Mobile:
2 def __init__(self,language = "英文"):
3 if language == "英文":
4 print("智能手机的默认语言为" + language)
5 else:
6 print("将智能手机的默认语言设置为" + language)
7 phone1 = Mobile()
8 phone2 = Mobile("中文")
(2)运行结果如图所示:
7、实战二:给信用卡设置默认密码
(1)创建信用卡类,并且为该类创建一个构造方法,该构造方法有3个参数,分别是self、卡号和密码。其中,密码可以设置一个默认值123456,代表默认密码。在创建类的实例的时,如果不指定密码,就采用默认密码,否则就要重置密码。代码如下:
1 class Card:
2 def __init__(self,cardid,password = "123456"):
3 self.cardid = cardid
4 self.password = password
5 if password == "123456":
6 print("信用卡" + self.cardid + "的默认密码为"+ self.password)
7 else:
8 print("重置信用卡" + self.cardid + "的密码为" + self.password)
9 card1 = Card("4013346302023459")
10 card2 = Card("4013346302023459","168779")
(2)运算结果如图所示:
8、实战三:打印每月销售明细
(1)模拟实现输出进销存管理系统中的每月销售明细查询,运行程序,输入要查询的月份,如果输入的月份存在销售明细,则显示本月商品销售明细;如果输入的月份不存在或者不是数字,则提示“该月没有销售数据或者输入的月份有误!“。代码如下:
1 class Sale_details:
2 def __init__(self):
3 self.mx = {"2":["商品编号:T0001 商品名称:笔记本电脑",
4 "商品编号:T0002 商品名称:华为荣耀6X",
5 "商品编号:T0003 商品名称:iPad",
6 "商品编号:T0004 商品名称:华为荣耀V9",
7 "商品编号:T0005 商品名称:MacBook\n"]}
8 print('-'*10 + "销售明细" + "-"*10)
9 self.ask()
10 def ask(self):
11 while True:
12 month = input("请输入要查询的月份(比如1、2、3等):")
13 if month in self.mx:
14 print(month + "月份的商品销售明细如下:")
15 for i in range(len(self.mx[month])):
16 print(self.mx[month][i])
17 else:
18 print("\n该月份没有销售数据或者输入月份有误!\n")
19 sale = Sale_details()
(2)运行结果如图所示:
9、实战四:模拟电影院的自动售票机选票页面
(1)在电影院中观看电影是一项很受欢迎的休闲娱乐,现在,请模拟电影院自动售票机中自动选择电影场次的页面,例如,一部电影在当日的播放时间有很多,可以自动选择合适的场次。代码如下:
1 class Selecet:
2 movie = {"《环太平洋:雷霆再起》":{"time":['9:30','10:40','12:00','14:00','16:30'],"seat":['10-01','10-02','10-03','10-04']},
3 "《头号玩家》":{"time":['8:30','9:40','12:50','15:00','18:50'],"seat":['09-01','09-02','08-03','06-04']},
4 "《红海行动》":{"time":['8:30','9:40','12:50','15:00','18:50'],"seat":['09-01','09-02','08-03','06-04']}}
5 times = []
6 seats = []
7 def selecet_movie(Selecet):
8 listmovie=[]
9 print('请选择正在上映的电影:',end="")
10 for i in Selecet.movie:
11 listmovie.append(i)
12 for j in range(len(listmovie)):
13 print(" " + str(j+1) + "、" + listmovie[j],end = "")
14 print("\n")
15 choose_film = int(input())
16 print("已选择电影:" + listmovie[choose_film-1] + "\n")
17 return listmovie[choose_film-1]
18 def changci(Selecet,choose_film):
19 print("请选择电影播放场次:",end = "")
20 for i in Selecet.movie[choose_film]["time"]:
21 Selecet.times.append(i)
22 for j in range(len(Selecet.times)):
23 print(" " + str(j+1) + "、" + Selecet.times[j],end = "")
24 print("\n")
25 choose_time = int(input())
26 print("已选择场次:" + Selecet.times[choose_time-1] + "\n")
27 return Selecet.times[choose_time-1]
28 def zuowei(Selecet,choose_film):
29 print("请选择座位剩余座位:",end = "")
30 for i in Selecet.movie[choose_film]["seat"]:
31 Selecet.seats.append(i)
32 for j in range(len(Selecet.seats)):
33 print(" " + str(j+1) + "、" + Selecet.seats[j],end = "")
34 print("\n")
35 choose_seat = int(input())
36 print("选择座位:" + Selecet.seats[choose_seat-1] + "\n")
37 return Selecet.seats[choose_seat-1]
38 def chupiao(Selecet,choose_film,choose_time,choose_seat):
39 print("正在出票。。。\n")
40 print("电影:" + choose_film)
41 print("播出时间:" + choose_time)
42 print("选择座位是:" + choose_seat)
43 print("\n出票完成,请别忘记取票!")
44 selecet1 = Selecet()
45 choose_film = Selecet.selecet_movie(Selecet)
46 choose_time = Selecet.changci(Selecet,choose_film)
47 choose_seat = Selecet.zuowei(Selecet,choose_film)
48 Selecet.chupiao(Selecet,choose_film,choose_time,choose_seat)
(2)运行结果如图所示:
一、实验目的和要求
1、学会类的定义和使用;
2、学会创建属性;
3、实现类的继承。
二、实验环境
软件版本:Python 3.10 64_bit
三、实验过程
1、实例1:创建大雁类并定义飞行方法
(1)在IDLE中创建一个名称为geese.py的文件,然后在该文件中定义一个大雁类Geese,并定义一个构造方法,然后再定义一个实例方法fly(),该方法有两个参数,一个是self,另一个用于指定飞行状态,最后再创建大雁类的实例,并调用实例方法fly()。代码如下:
1 class Geese: # 创建大雁类
2 """大雁类"""
3 def __init__(self,beak,wing,claw): # 构造方法
4 print("我是大雁类!我有以下特征:")
5 print(beak) # 输出喙的特征
6 print(wing) # 输出翅膀的特征
7 print(claw) # 输出爪子的特征
8 def fly(self,state): # 定义飞行方法
9 print(state)
10 """*******************调用方法***************"""
11 beak_1 = "喙的基部较高,长度与头部的长度几乎相等" # 喙的特征
12 wing_1 = "翅膀长而尖" # 翅膀的特征
13 claw_1 = "爪子是蹼状的" # 爪子的特征
14 wildGoose = Geese(beak_1,wing_1,claw_1) # 创建大雁类的实例
15 wildGoose.fly("我飞行的时候,一会儿排成个人字,一会排成个一字") # 调用实例方法
(2)运行结果如图所示:
2、实例2:通过类属性统计类的实例个数
(1)在IDLE中创建一个名称为geese_a.py的文件,然后在该文件中定义一个雁类Geese,并在该类中定义4个类属性,前三个用于记录雁类的特征,第4个用于记录实例编号,然后定义一个构造方法,在该构造方法中将记录实例编号的类属性进行加1操作,并输出4个类属性的值,最后通过for循环创建4个雁类的实例。代码如下:
1 class Geese:
2 """雁类"""
3 neck = "脖子较长" # 类属性(脖子)
4 wing = "振翅频率高" # 类属性(翅膀)
5 leg = "腿位于身体的中心支点,行走自如" # 类属性(腿)
6 number = 0 # 编号
7 def __init__(self): # 构造方法
8 Geese.number += 1 # 将编号加1
9 print("\n我是第" + str(Geese.number) + "只大雁,我属于雁类!我有以下特征:")
10 print(Geese.neck) # 输出脖子的特征
11 print(Geese.wing) # 输出翅膀的特征
12 print(Geese.leg) # 输出腿的特征
13 # 创建4个雁类的对象(相当于有4只大雁)
14 list1 = []
15 for i in range(4): # 循环4次
16 list1.append(Geese()) # 创建一个雁类的实例
17 print("一共有" + str(Geese.number) + "只大雁")
(2)运行结果如图所示:
3、实例3:在模拟电影点播功能时应用属性
(1)在IDLE中创建一个名称为film.py的文件,然后在该文件中定义一个电视节目类TVshow,并在该类中定义一个类属性,用于保存电影列表,然后在__init__()方法中定义一个私有的实例属性,再将该属性转换为可读取、可修改(有条件进行)的属性,最后创建类的实例,并获取和修改属性值。代码如下:
1 class TVshow:
2 list_film = ["战狼2","红海行动","西游记女儿国","熊出没•变形记"]
3 def __init__(self,show):
4 self.__show = show
5 @property
6 def show(self):
7 return self.__show
8 @show.setter
9 def show(self,value):
10 if value in TVshow.list_film:
11 self.__show = "您选择了《" + value + "》,稍后将播放"
12 else:
13 self.__show = "您点播的电影不存在"
14 tvshow = TVshow("战狼2")
15 print("正在播放:《",tvshow.show,"》")
16 print("您可以从",tvshow.list_film,"中选择要点播放的电影")
17 tvshow.show = "红海行动"
18 print(tvshow.show)
(2)运行结果如图所示:
4、实例4:创建水果基类及其派生类
(1)在IDLE中创建一个名称为fruit.py的文件,然后在该文件中定义一个水果类Fruit(作为基类),并在该类中定义一个类属性(用于保存水果默认的颜色)和一个harvest()方法,然后创建Apple类和Orange类,都继承自Fruit类,最后创建Apple类和Orange类,都继承自Fruit类,最后创建Apple类和Orange类的实例,并调用harvest()方法(在基类中编写)。代码如下:
1 class Fruit:
2 color = "绿色"
3 def harvest(self,color):
4 print("水果是:" + color + "的!")
5 print("水果已经收获……")
6 print("水果原来是:" + Fruit.color + "的!")
7 class Apple(Fruit):
8 color = "红色"
9 def __init__(self):
10 print("我是苹果")
11 class Orange(Fruit):
12 color = "橙色"
13 def __init__(self):
14 print("我是橘子")
15 apple = Apple()
16 apple.harvest(apple.color)
17 orange = Orange()
18 orange.harvest(orange.color)
(2)运行结果如图所示:
5、实例5:在派生类中调用基类的__init__()方法定义类属性
(1)在IDLE中创建一个名称为fruit_a.py的文件,然后在该文件中定义一个水果类Fruit(作为基类),并在该类中定义__init__()方法,在该方法中定义一个类属性(用于保存水果默认的颜色),然后在Fruit类中定义一个harvest()方法,再创建Apple类和Sapodilla类,都继承自Fruit类,最后创建Apple类和Sapodilla类的实例,并调用harvest()方法(在基类中编写)。代码如下:
1 class Fruit:
2 def __init__(self,color = "绿色"):
3 Fruit.color = color
4 def harvest(self,color):
5 print("水果是:" + self.color + "的!")
6 print("水果已经收获……")
7 print("水果原来是:" + Fruit.color + "的!")
8 class Apple(Fruit):
9 color = "红色"
10 def __init__(self):
11 print("我是苹果")
12 super().__init__()
13 class Sapodilla(Fruit):
14 def __init__(self,color):
15 print("\n我是人参果")
16 super().__init__(color)
17 # 重写harvest()方法的代码
18 def harvest(self,color):
19 print("人参果是:" + color + "的!")
20 print("人参果已经收获……")
21 print("人参果原来是:" + Fruit.color + "的!")
22 apple = Apple()
23 apple.harvest(apple.color)
24 sapodilla = Sapodilla("白色")
25 sapodilla.harvest("金黄色带紫色条纹")
(2)运行结果如图所示:
6、实战一:导演为剧本选主角
(1)智能手机的默认语言为英文,但制作手机时可以将默认语言设置为中文。编写手机类,采用无参构造方法时,表示使用默认语言设计,利用有参构造方法时,修改手机的默认语言。代码如下:
1 class Mobile:
2 def __init__(self,language = "英文"):
3 if language == "英文":
4 print("智能手机的默认语言为" + language)
5 else:
6 print("将智能手机的默认语言设置为" + language)
7 phone1 = Mobile()
8 phone2 = Mobile("中文")
(2)运行结果如图所示:
7、实战二:给信用卡设置默认密码
(1)创建信用卡类,并且为该类创建一个构造方法,该构造方法有3个参数,分别是self、卡号和密码。其中,密码可以设置一个默认值123456,代表默认密码。在创建类的实例的时,如果不指定密码,就采用默认密码,否则就要重置密码。代码如下:
1 class Card:
2 def __init__(self,cardid,password = "123456"):
3 self.cardid = cardid
4 self.password = password
5 if password == "123456":
6 print("信用卡" + self.cardid + "的默认密码为"+ self.password)
7 else:
8 print("重置信用卡" + self.cardid + "的密码为" + self.password)
9 card1 = Card("4013346302023459")
10 card2 = Card("4013346302023459","168779")
(2)运算结果如图所示:
8、实战三:打印每月销售明细
(1)模拟实现输出进销存管理系统中的每月销售明细查询,运行程序,输入要查询的月份,如果输入的月份存在销售明细,则显示本月商品销售明细;如果输入的月份不存在或者不是数字,则提示“该月没有销售数据或者输入的月份有误!“。代码如下:
1 class Sale_details:
2 def __init__(self):
3 self.mx = {"2":["商品编号:T0001 商品名称:笔记本电脑",
4 "商品编号:T0002 商品名称:华为荣耀6X",
5 "商品编号:T0003 商品名称:iPad",
6 "商品编号:T0004 商品名称:华为荣耀V9",
7 "商品编号:T0005 商品名称:MacBook\n"]}
8 print('-'*10 + "销售明细" + "-"*10)
9 self.ask()
10 def ask(self):
11 while True:
12 month = input("请输入要查询的月份(比如1、2、3等):")
13 if month in self.mx:
14 print(month + "月份的商品销售明细如下:")
15 for i in range(len(self.mx[month])):
16 print(self.mx[month][i])
17 else:
18 print("\n该月份没有销售数据或者输入月份有误!\n")
19 sale = Sale_details()
(2)运行结果如图所示:
9、实战四:模拟电影院的自动售票机选票页面
(1)在电影院中观看电影是一项很受欢迎的休闲娱乐,现在,请模拟电影院自动售票机中自动选择电影场次的页面,例如,一部电影在当日的播放时间有很多,可以自动选择合适的场次。代码如下:
1 class Selecet:
2 movie = {"《环太平洋:雷霆再起》":{"time":['9:30','10:40','12:00','14:00','16:30'],"seat":['10-01','10-02','10-03','10-04']},
3 "《头号玩家》":{"time":['8:30','9:40','12:50','15:00','18:50'],"seat":['09-01','09-02','08-03','06-04']},
4 "《红海行动》":{"time":['8:30','9:40','12:50','15:00','18:50'],"seat":['09-01','09-02','08-03','06-04']}}
5 times = []
6 seats = []
7 def selecet_movie(Selecet):
8 listmovie=[]
9 print('请选择正在上映的电影:',end="")
10 for i in Selecet.movie:
11 listmovie.append(i)
12 for j in range(len(listmovie)):
13 print(" " + str(j+1) + "、" + listmovie[j],end = "")
14 print("\n")
15 choose_film = int(input())
16 print("已选择电影:" + listmovie[choose_film-1] + "\n")
17 return listmovie[choose_film-1]
18 def changci(Selecet,choose_film):
19 print("请选择电影播放场次:",end = "")
20 for i in Selecet.movie[choose_film]["time"]:
21 Selecet.times.append(i)
22 for j in range(len(Selecet.times)):
23 print(" " + str(j+1) + "、" + Selecet.times[j],end = "")
24 print("\n")
25 choose_time = int(input())
26 print("已选择场次:" + Selecet.times[choose_time-1] + "\n")
27 return Selecet.times[choose_time-1]
28 def zuowei(Selecet,choose_film):
29 print("请选择座位剩余座位:",end = "")
30 for i in Selecet.movie[choose_film]["seat"]:
31 Selecet.seats.append(i)
32 for j in range(len(Selecet.seats)):
33 print(" " + str(j+1) + "、" + Selecet.seats[j],end = "")
34 print("\n")
35 choose_seat = int(input())
36 print("选择座位:" + Selecet.seats[choose_seat-1] + "\n")
37 return Selecet.seats[choose_seat-1]
38 def chupiao(Selecet,choose_film,choose_time,choose_seat):
39 print("正在出票。。。\n")
40 print("电影:" + choose_film)
41 print("播出时间:" + choose_time)
42 print("选择座位是:" + choose_seat)
43 print("\n出票完成,请别忘记取票!")
44 selecet1 = Selecet()
45 choose_film = Selecet.selecet_movie(Selecet)
46 choose_time = Selecet.changci(Selecet,choose_film)
47 choose_seat = Selecet.zuowei(Selecet,choose_film)
48 Selecet.chupiao(Selecet,choose_film,choose_time,choose_seat)
(2)运行结果如图所示: