Python实验报告——第7章 面向对象程序设计
实验报告
【实验目的】
1.掌握Python中如何定义类、使用类,以及property属性的应用等。
2.掌握封装、继承、多态等OOP应用。
【实验条件】
1.PC机或者远程编程环境。
【实验内容】
1.完成第七章 面向对象程序设计 实例01-05,实战一到实战四
实例01:通过类属性统计类的实例个数
在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 #调用方法
12 beak_1 = "喙的基部较高,长度和头部的长度几乎相等"
13 wing_1 = "翅膀长而尖"
14 claw_1 = "爪子是璞状的"
15 whildGoose = Geese(beak_1, wing_1, claw_1)
16 whildGoose.fly("我飞行的时候,一会儿排成个人字,一会排成个一字")
运行结果如下:
实例02:根据身高、体重计算BMI指数(共享版)
在 IDLE中创建一个名称为geese_a.py 的文件,然后在该文件中定义一个雁类Geese,并在该类中定义4个类属性,前3个用于记录雁类的特征,第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
9 print("\n我是第" + str(Geese.number) + "只大雁,我属于雁类!我有以下特征:")
10 print(Geese.neck)
11 print(Geese.wing)
12 print(Geese.leg)
13
14 #创建四个雁类的对象
15 list1 = []
16 for i in range(4):
17 list1.append(Geese())
18 print("一共有" + str(Geese.number) + "只大雁")
运行结果如下:
实例03:在模拟电影点播功能时应用属性
在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 #设置setter方法,修改稀有属性的值
9 def show(self, value):
10 if value in TVshow.list_film: #判断值是否在列表中
11 self.__show = "您选择了《" + value + "》, 稍后将播放"
12 else:
13 self.__show = "您点播的电影不存在"
14
15 tvshow = TVshow("战狼2")
16 print("正在播放:《", tvshow.show, "》")
17 print("您可以从", tvshow.list_film, "中选择要播放的电影")
18 tvshow.show = "红海行动"
19 print(tvshow.show)
运行结果如下:
实例04:创建水果基类及其派生类
在IDLE中创建一个名称为 fruit.py 的文件,然后在该文件中定义一个水果类Fruit(作为基类),并在该类中定义一个类属性(用于保存水果默认的颜色)和一个harvest()方法,然后创建Apple类和Orange类,都继承自Fruit类,最后创建Apple类和Orange类的实例,并调用harvest()方法(在基类中编写)。
代码如下:
1 class Fruit:
2 color = "绿色"
3 def harvest(self, color):
4 print("水果是:" + color + "的!") #输出形参color
5 print("水果已经收获......")
6 print("水果原来是:" + Fruit.color + "的!"); #输出类属性color
7
8 class Apple(Fruit): #继承父类Fruit
9 color = "红色"
10 def __init__(self):
11 print("我是苹果")
12
13 class Orange(Fruit):
14 color = "橙色"
15 def __init__(self):
16 print("\n我是橘子")
17 apple = Apple()
18 apple.harvest(apple.color) #调用父类的harvest方法
19 orange = Orange()
20 orange.harvest(orange.color) #调用父类的harvest方法
运行结果如下:
实例05:在派生类中调用基类的__init__()方法定义类属性
在IDLE中创建一个名称为fruit.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 + "的!") #输出形参color
6 print("水果已经收获......")
7 print("水果原来是:" + Fruit.color + "的!") #输出类属性color
8
9 class Apple(Fruit):
10 color = "红色"
11 def __init__(self):
12 print("我是苹果")
13 super().__init__() #调用父类的构造器
14
15 class Sapodilla(Fruit):
16 def __init__(self, color):
17 print("\n我是人参果")
18 super().__init__(color) #调用父类的构造器
19 #重写父类harvest()方法
20 def harvest(self, color):
21 print("人参果是:" + self.color + "的!") # 输出形参color
22 print("人参果已经收获......")
23 print("人参果原来是:" + Fruit.color + "的!") #输出类属性color
24
25 apple = Apple()
26 apple.harvest(apple.color)
27 sapodilla = Sapodilla("白色")
28 sapodilla.harvest("金黄色带紫色条纹")
运行结果如下:
实战一:修改手机默认语言
模智能手机的默认语言为英文,但制造手机时可以将默认语言设置为中文。编写手机类,采用无参构造方法时,表示使用默认语言设计,利用有参构造方法时,修改手机的默认语言。效果如图7.22所示。
代码如下:
1 class Phone:
2 def __init__(self, language = "英文"):
3 if language == "英文":
4 print("智能手机的默认语言为英文")
5 else:
6 print("将智能手机的默认语言设置为" + language)
7 phone1 = Phone()
8 phone2 = Phone("中文")
9
10
11 # Python的构造函数是不能重载一个类只能有一个构造函数存在。
12 # 定义多个构造方法时,实例化类只实例化最后的构造方法
13 # 即后面的构造方法会覆盖前面的构造方法
运行结果如下:
实战二:给信用卡设置默认密码
创建信用卡类,并且为该类创建一个构造方法,该构造方法有3个参数,分别是self、卡号和密码。其中,密码可以设置一个默认值123456,代表默认密码。在创建类的实例时,如果不指定密码,就采用默认密码,否则要重置密码。效果如图7.23所示。
代码如下:
1 class Card:
2 def __init__(self, id, pwd = "123456"):
3 if pwd == "123456":
4 print("信用卡" + str(id) + "的默认密码为" + str(pwd))
5 else:
6 print("重置信用卡" + str(id) + "的密码为" + str(pwd))
7
8 card1 = Card("40137335633800642")
9 card2 = Card("40137335633800642", "168779")
运行结果如下:
实战三:打印每月销售明细
模拟实现输出进销存管理系统中的每月销售明细,运行程序,输入要查询的月份,如果输入的月份存在销售明细,则显示本月商品销售明细;如果输入的月份不存在或不是数字,则提示“该月没有销售数据或者输入的月份有误!”。效果如图7.24所示。
代码如下:
1 class Sale:
2 def __init__(self):
3 self.details = {'2': ['商品编号:T0001 商品名称:笔记本电脑',
4 '商品编号:T0002 商品名称:华为荣耀6X',
5 '商品编号:T0003 商品名称:iPad',
6 '商品编号:T0004 商品名称:华为荣耀V9',
7 '商品编号:T0005 商品名称:MacBook']}
8 def showInfo(self, month): #查询商品明细
9 if month in self.details:
10 print(str(month) + "月份的商品销售明细如下:")
11 for item in self.details[month]:
12 print(item)
13 else:
14 print("该月份没有销售数据或输入月份有误!")
15
16 print("————————————————销售明细——————————————————")
17 sale = Sale()
18 while(True):
19 month = input("请输入要查询的月份(比如1、2、3等,输入0退出):")
20 if month == '0':
21 break
22 sale.showInfo(month)
运行结果如下:
实战四:模拟电影院的自动售票机选票页面
在电影院中观看电影是一项很受欢迎的休闲娱乐,现请模拟电影院自动售票机中自动选择电影场次的页面,例如,一部电影在当日的播放时间有很多,可以自动选择合适的场次。效果如图7.25所示。
代码如下:
1 class Movie:
2 movie_name = ''
3 sessions = ''
4 seat = ''
5
6 def __init__(self):
7 print('\n欢迎使用自动售票机~~')
8
9 def choiceMovie(self, name): #选择电影
10 Movie.movie_name = name
11 print("已选电影:" + Movie.movie_name)
12
13 def choiceSessions(self, sessions): #选择场次
14 Movie.sessions = "2018.4.12 " + sessions
15 print('电影场次:' + sessions)
16
17 def seats(self, seat): #选择座位
18 Movie.seat = seat
19 print('选择座位:' + seat)
20
21 def showInfo(self):
22 print("电影:" + Movie.movie_name)
23 print("播出时间:" + Movie.sessions)
24 print("座位:" + Movie.seat)
25 print('\n出票完成,请别忘记取票')
26
27 movie1 = Movie()
28 print('\n请选择正在上映的电影:1、《长津湖》 2、《战狼2》3、《红海行动》')
29 movie1.choiceMovie(input())
30 print('\n请选择电影播放场次:1、9:30 2、10:40 3、12:00')
31 movie1.choiceSessions(input())
32 print('\n请选择座位剩余座位:10-01, 10-02, 10-03, 10-04')
33 movie1.seats(input())
34 print('\n正在出票。。。\n')
35 # 电影票信息
36 movie1.showInfo()
运行结果如下: