实验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)运行结果如图所示:

 

Python任务流框架_Python任务流框架

 

 

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)运行结果如图所示:

Python任务流框架_类属性_02

 

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)运行结果如图所示:

Python任务流框架_Python任务流框架_03

 

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)运行结果如图所示: 

Python任务流框架_类属性_04

 

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)运行结果如图所示:

Python任务流框架_构造方法_05

 

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)运行结果如图所示:

Python任务流框架_Python任务流框架_06

 

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)运算结果如图所示:

 

Python任务流框架_构造方法_07

 

 

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)运行结果如图所示:

 

Python任务流框架_类属性_08

 

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)运行结果如图所示:

Python任务流框架_Apple_09

 

 




一、实验目的和要求

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)运行结果如图所示:

 

Python任务流框架_Python任务流框架

 

 

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)运行结果如图所示:

Python任务流框架_类属性_02

 

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)运行结果如图所示:

Python任务流框架_Python任务流框架_03

 

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)运行结果如图所示: 

Python任务流框架_类属性_04

 

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)运行结果如图所示:

Python任务流框架_构造方法_05

 

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)运行结果如图所示:

Python任务流框架_Python任务流框架_06

 

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)运算结果如图所示:

 

Python任务流框架_构造方法_07

 

 

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)运行结果如图所示:

 

Python任务流框架_类属性_08

 

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)运行结果如图所示:

Python任务流框架_Apple_09