实验7:面向对象程序设计
一、实验目的和要求
1、了解面向对象的基本概念(对象、类、构造方法);
2、学会类的定义和使用;
3、掌握属性的创建和修改;
4、掌握继承的基本语法。
二、实验环境
软件版本:Python 3.10 64_bit
三、实验过程
1、实例01:创建大雁类并定义飞行方法
(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) #创建新的对象wildGoose并制定其属性 15 wildGoose.fly("我飞行的时候一会儿排成个人字,一会排成个一字")
(2)运行结果如下:
2、实例02:通过类属性统计类的实例个数
(1)在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 list1 =[] #定义一个空列表 14 for i in range (4): #循环4次 15 list1.append(Geese()) #创建一个雁类的实例 16 print("一共有"+str(Geese.number)+"只大雁") #统计总数
(2)运行结果如下:
3、实例03:在模拟电影点播功能时应用属性
(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): #定义show()方法 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 tvshow = TVshow("战狼2") #新建实例tvshow 15 print("正在播放:《",tvshow.show,"》") #获取属性值 16 print("您可以从",tvshow.list_film,"中选择要点播的电影") 17 tvshow.show = "红海行动" #修改属性值 18 print(tvshow.show)
(2)运行结果如下:
·如果将第17行代码中的“红海行动”修改为“捉妖记”,将显示如下内容
4、实例04:创建水果基类及其派生类
(1)在IDLE中创建一个名称为fruit.py的文件,然后在该文件中定义一个水果类Fruit(作为基类),并在该类中定义一个类属性(用于保存水果默认颜色)和一个harvest()方法,然后创建Apple类和Orange类,都继承自Fruit类,最后创建Apple类和Orange类的实例,并调用harvest()方法(在基类中编写),代码如下:
1 class Fruit: #定义水果类(父类) 2 color = "绿色" #定义属性 3 def harvest(self,color): #创建实例方法harvest(两个参数) 4 print("水果是:"+color+ "的!") 5 print("水果已经收获……") 6 print("水果原来是:"+Fruit.color+"的!") 7 class Apple(Fruit): #定义苹果类(子类) 8 color = "红色" #重新定义子类的color属性 9 def __init__(self): #文件加密,仅可读 10 print("我是苹果") 11 class Orange(Fruit): 12 color = "橙色" 13 def __init__(self): 14 print("\n我是橘子") 15 16 apple = Apple() #创建新实例 17 apple.harvest(apple.color) #调用apple的harvest方法,以()为新属性 18 orange = Orange() 19 orange.harvest(orange.color)
(2)运行结果如下:
5、实例05:在派生类中调用基类的__init__()方法定义类属性
(1)在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): #创建实例方法harvest(两个参数) 5 print("水果是:"+self.color+"的!") #输出的是形式参数color 6 print("水果已经收获……") 7 print("水果原来是:"+Fruit.color+"的!") 8 class Apple(Fruit): 9 color = "红色" 10 def __init__(self): 11 print("我是苹果") 12 super().__init__() #调用基类的__init__()方法 13 class Sapodilla(Fruit): #定义人参果类(派生类) 14 def __init__(self,color): 15 print("\n我是人参果") 16 super().__init__(color) 17 def harvest(self,color): #重写harvest()方法 18 print("人参果是:"+Fruit.color+"的!") 19 print("人参果已经收获……") 20 print("人参果原来是:"+Fruit.color+"的!") 21 apple = Apple() 22 apple.harvest(apple.color) #调用harvest()方法 23 sapodilla = Sapodilla("白色") 24 sapodilla.harvest("金黄色带紫色条纹") #修改函数的color参数
(2)运行结果如下:
6、实战01:修改手机默认语言
(1)在IDLE中创建一个名称为language.py的文件,然后在该文件中定义一个手机类,并且为该类创建两个构造方法,其中一个构造方法moren()将手机的默认语言设置为英文,另一个构造方法chongzhi()可修改参数值language,然后再创建两个手机类的实例,分别输出两个构造方法的应用,代码如下:
1 class Mobile: #定义手机类 2 def moren(self,language = "英语"): #语言参数的默认值为 英语 3 print("智能手机的默认语言为"+language) 4 def chongzhi(self,language): 5 print("将智能手机的默认语言设置为"+language) #修改参数language的值 6 moren = Mobile() #建立Mobile类的新实例 7 moren.moren() #调用moren()方法 8 xiugai1 = Mobile() 9 xiugai1.chongzhi("中文")
(2)运行结果如下:
7、实战02:给信用卡设置默认密码
(1)在IDLE中创建一个名称为cardpassport.py的文件,然后在该文件中创建信用卡类,并且为该类创建一个构造方法,该构造方法有三个参数,分别是self、卡号和密码。其中默认密码为123456,在创建实例中,如果不指定密码就采用默认密码,否则要重置密码,代码如下:
1 class Card: #定义信用卡类 2 def infor(self,cardid ="4013735633800642",passport="123456"):#cardid passport参数设置默认值 3 print("信用卡"+cardid+"的默认密码为"+passport) 4 def chongzhi(self,passport,cardid ="4013735633800642"): 5 print("重置信用卡"+cardid+"的密码为"+passport) #修改参数language的值 6 begin = Card() #建立Card类的新实例 7 begin.infor() #调用moren()方法 8 after = Card() 9 after.chongzhi(passport='168779')
(2)运行结果如下:
8、实战03:打印每月销售明细
(1)在IDLE中创建一个名称为printsale.py的文件,模拟实现输出进销存管理系统中的每月销售明细,运行程序,输入要查询的月份,如果输入的月份存在销售明细,则显示本月商品销售明细;如果输入的月份不存在或不是数字,则提示“改越没有销售数据或者输入的月份有误!”,代码如下:
1 class SaleHandler: #定义销售类 2 '''销售管理类''' 3 def __init__(self): #定义字典{key:value[列表]} 4 self.__sale_data = {"2":[('T0001','笔记本电脑'),('T0002','华为荣耀6X'),('T0003','iPad'), 5 ('T0004','华为荣耀V9'),('T0005','MacBook')]} 6 def outputSaleList(self,query_month): #query_month ? 7 '''根据输入月份,查询商品明细''' 8 if query_month in self.__sale_data: 9 print("%s月份商品销售明细如下:"%query_month) # %query_month ? 10 for item in self.__sale_data[query_month]: 11 print("商品编号:%s\t商品名称:%s"%item) 12 else: 13 print("该月份没有销售数据或输入月份有误!") 14 print("—"*10+"销售明细"+"—"*10) 15 sh = SaleHandler() 16 while(True): #循环结构 17 month = input("请输入要查询的月份(比如1、2、3等):") 18 if month =='0': #跳出循环的值 19 break 20 sh.outputSaleList(month)
(2)运行结果如下:
9、实战04:模拟电影院的自动售票机选票页面
(1)在IDLE中创建一个名称为zidongsale.py的文件,模拟电影院自动售票机中自动选择电影场次的页面,使其可以自动选择合适的场次,代码如下:
1 import time 2 timenow = time.strftime("%Y.%m.%d",time.localtime()) 3 print("\n欢迎使用自动售票机~~") 4 5 print("\n请选择正在上映的电影:1、《长津湖》\t2、《战狼2》\t3、《红海行动》") 6 dy = input("已选电影:") 7 8 print("\n请选择电影播放场次:1、9:30\t2、10:40\t3、12:00") 9 cc = input("电影场次:") 10 11 print("\n请选择座位剩余座位:10-10,10-02,10-03,10-04") 12 zw = input("选择座位:") 13 14 print("\n正在出票。。。") 15 print("电影:",dy) 16 print("播出时间:",timenow,cc) 17 print("座位:",zw) 18 print("\n出票完成,请别忘记取票")
(2)运行结果如下: