第9章 面向对象编程_第1页
第9章 面向对象编程_第2页
第9章 面向对象编程_第3页
第9章 面向对象编程_第4页
第9章 面向对象编程_第5页
已阅读5页,还剩94页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第9章面向对象编程第9章面向对象编程熟练掌握类的设计和使用。深入理解类和对象、面向过程和面向对象的方法。掌握类的属性、类的方法、对象的创建与初始化方法、析构方法。熟练掌握类的继承方法。主要内容9.1面向对象的基本概念9.2类与对象9.3构造方法与析构方法9.4类方法和静态方法9.5应用案例1:超市管理系统9.6类的继承9.7多态9.8应用案例2:太空探索游戏9.9上机实践:学生成绩更新奇妙动物乐园9.1面向对象的基本概念对象是面向对象编程中的基本单位。每个对象都是现实世界中的一个实体或概念的抽象表示。对象具有状态和行为。状态由对象的属性(或称为数据成员、实例变量)表示,而行为则由对象的方法(或称为成员函数、实例方法)定义。例如,一个汽车对象可能具有颜色、品牌、速度等属性,以及启动、加速、刹车等方法。1.对象(Object)5类是对象的模板或蓝图。它定义了具有相同属性和行为的对象的共同特征。类定义了对象的结构,包括数据成员(属性)和成员函数(方法)。类还可以定义对象之间的关系,如继承和多态。通过使用类,可以创建多个具有相同属性和行为的对象实例。2.类(Class)6封装是面向对象编程中的一个重要概念。它指的是将对象的属性和方法隐藏在其内部,只通过对象提供的接口进行访问和修改。封装有助于保护对象的内部状态,防止外部代码直接访问和修改对象的私有数据。同时,封装也提供了数据抽象和信息隐藏的能力,使得对象的使用者只需要关心对象提供的接口,而不需要了解对象内部的实现细节。3.封装(Encapsulation)7继承是面向对象编程中的一个重要特性。它允许一个类(子类)继承另一个类(父类)的属性和方法。子类可以继承父类的所有属性和方法,并可以添加或覆盖父类的属性和方法。通过继承,可以实现代码的重用和扩展。同时,继承也提供了一种层次结构,使得可以更加清晰地组织和管理代码。4.继承(Inheritance)8多态是面向对象编程中的另一个重要特性。它指的是同一个操作可以作用于不同类型的对象,从而产生不同的结果。多态通过方法重写和方法重载来实现。通过多态,可以为不同的对象类型定义不同的行为,使得程序更加灵活和可扩展。5.多态(Polymorphism)99.2类与对象类(Class)是定义对象结构和行为的蓝图或模板。类定义了对象的属性(也称为数据成员或实例变量)和方法(也称为成员函数或实例方法)。属性描述了对象的状态,而方法则定义了对象的行为。类可以看作是一种数据类型,它封装了数据和方法,可以创建具有相同属性和行为的多个对象实例。对象(Object)是类的实例。每个对象都是根据类创建的,并继承了类的属性和方法。对象代表了现实世界中可以明确标识的一个实体或概念。例如,一个汽车对象可能代表了现实世界中的一辆具体汽车,具有品牌、颜色、速度等属性,以及设置/获取汽车品牌、颜色和速度等方法,显示了一个汽车类,如图所示。类与对象11汽车类9.2.1类的定义12理解类的定义,能自定义类

先定一个小目标!类的定义使用class关键字开始,后面跟着类的名称。类的名称通常遵循驼峰命名法(即每个单词的首字母大写),并且通常以大写字母开头以区别于变量和函数,具体格式如下。类的定义131class类名:#使用class定义类2属性名=属性值#定义属性3def方法名(self):#定义方法4方法体例9-1定义一个动物类Animal141classAnimal:2legs=4类属性,定义4条腿的动物3

4def__init__(self,name,age,weight,diet_type):5=name实例属性6self.age=age7self.weight=weight8self.diet_type=diet_type饮食习惯9

10defShout(self):11print("动物叫")12

13defEat(self):14print("动物吃东西")

1516defRun(self):17print("动物奔跑")9.2.2对象的创建与使用15掌握对象的创建与使用

先定一个小目标!创建对象的格式创建Animal对象dog1.对象的创建16对象名=类名()dog=Animal("金毛",3,10,"肉食")访问对象成员的方式访问对象的属性2.访问对象成员17对象名.属性#访问对象的属性对象名.方法()#访问对象的方法#访问对象dog的name属性和age属性print()print(dog.age)程序的运行结果金毛3调用对象的方法2.访问对象成员18#调用对象dog的成员方法dog.shout()dog.eat()dog.run()程序的运行结果动物叫动物吃东西动物奔跑9.2.3类中的属性19理解类的属性分类,掌握属性的定义方法

先定一个小目标!通常将类中的变量称为属性。根据属性与类和实例的关联关系,可以将属性分为实例属性(成员变量)和类属性(类变量)。(1)实例属性实例属性(成员变量)是在构造方法__init__()中定义的,通过self参数引用。在类的外部,实例属性(成员变量)属于类的某个具体对象,只能通过对象名访问。如例9-1中定义的name、age都属于实例属性,在代码9-3中通过对象名进行访问。(2)类属性类属性(类变量)是在类中方法之外定义的的变量。类属性(类变量)属于类,既可以通过类名访问,又可以通过对象名访问,被类的所有对象所共享。类中的属性20例9-1中定义的legs属性,动物类的所有对象都可以共享这个属性值类中的属性21#修改类属性Animal.legs=2kangaroo=Animal("小毛",5,50,"草食")print(Animal.legs)print(kangaroo.legs)程序的运行结果229.2.4实例方法22理解类的实例方法,掌握方法如何定义

先定一个小目标!在类中定义实例方法时,方法的第一个参数为self。在调用方法时,self参数的值不需要显式传递,系统会将方法所属的对象传入该参数。在方法内部,可以通过这个参数调用对象本身的资源,如属性、方法等。实例方法定义的格式如下。1.实例方法的定义231def方法名(self,其他参数):2#方法体实例方法的使用1.实例方法的定义241classPerson:2def__init__(self,name,age):3=name4self.age=age5

6defIntroduce(self):7print(f"你好,我的名字是{},我今年{self.age}岁了!")要调用实例方法,需要先创建一个类的对象实例,然后通过这个对象来调用方法。这是因为实例方法是与对象实例绑定的,而不是与类本身绑定的。实例方法调用的格式如下。2.实例方法的调用251对象名.方法名(其他参数)调用实例方法2.实例方法的调用261#创建Person类的实例2person=Person("张珊",20)3person.Introduce()程序的运行结果你好,我的名字是张珊,我今年20岁了!实例方法不仅可以访问实例属性,还可以调用类中的其他方法或访问其他实例属性。可以在对象内部实现复杂的逻辑和操作。3.方法内部访问其他方法和属性271classPerson:2def__init__(self,name,age):3=name4self.age=age5

6defIntroduce(self):7print(f"你好,我的名字是{},我今年{self.age}岁了!")8

9defGreet(self):10self.Introduce()11print("见到你很高兴!")12

13#创建Person类的实例14person=Person("李思",30)15#调用Greet方法,它会进一步调用Introduce方法16person.Greet()3.方法内部访问其他方法和属性28程序的运行结果你好,我的名字是李思,我今年30岁了!见到你很高兴!9.2.5类成员的访问限制29理解类成员的访问限制,掌握如何正确访问类的成员

先定一个小目标!类中定义的属性和方法默认都是共有成员,类之外的代码都可以访问这些共有成员。为了契合面向对象编程的封装原则,Python支持将类中的成员设置为私有成员,私有成员只能在类的内部调用,这在一定程度上限制对象对类成员的访问。9.2.5类成员的访问限制30在成员属性和方法名之前佳上两个下划线“__”作为前缀,则该属性或方法就是类的私有成员,语法格式如下。1.定义私有成员311__属性名2__方法名定义一个包含私有属性__age和私有方法__info()的类CustomerInfo。1.定义私有成员321classCustomerInfo:2__age=20#私有属性3

4def__info(self):#私有方法5print(f"我的年龄是:{self.__age}")在上述代码的基础上,通过创建CustomerInfo类的对象customer,通过该对象访问类的私有属性和私有方法。运行代码后输出以下错误提示信息。AttributeError:'CustomerInfo'objecthasnoattribute'__age'注释访问私有属性的代码(第2行),运行程序,则输出以下错误提示信息。AttributeError:'CustomerInfo'objecthasnoattribute'__info'2.2.私有成员的访问331customer=CustomerInfo()2customer.__age3customer.__info()由以上展示的错误提示信息可以判断,对象名无法直接访问类的私有成员。下面分别介绍如何在类的内部如何访问私有属性和私有方法。(1)访问私有属性。私有属性可以在类的共有方法中通过参数self访问,在类的外部可以通过调用共有方法从而间接访问私有属性。以类CustomerInfo为例,通过增加公有方法get_info()访问私有属性__age,如代码所示。运行代码后输出以下结果。我的年龄是:202.2.私有成员的访问341classCustomerInfo:2__age=20私有属性3

4defget_info(self):公有方法5print(f"我的年龄是:{self.__age}")6

7customer=CustomerInfo()8customer.get_info()(2)访问私有方法。私有方法同样可以在公有方法中通过参数self访问,修改CustomerInfo类,私有方法__info()中通过self参数访问私有属性__age,并在公有方法get_info()中通过self参数访问私有方法__info(),如代码所示。运行代码后输出以下结果。我的年龄是:202.2.私有成员的访问351classCustomerInfo:2__age=20私有属性3def__info(self):私有方法4print(f"我的年龄是:{self.__age}")5

6defget_info(self):公有方法7self.__info()8

9customer=CustomerInfo()10customer.get_info()9.3构造方法与析构方法在Python中,类中有两个特殊的方法:构造方法__init__()和析构方法__del__(),这两个方法分别在对象创建和销毁时自动调用。9.3构造方法与析构方法379.3.1构造方法38理解构造方法的概念,掌握如何正确使用构造方法

先定一个小目标!每个类都有一个默认的__init__()构造方法,如果在类的定义中显式地定义了__init__()方法,则创建对象时Python解释器会调用显示定义的__init__()方法;如果定义类时没有显式定义_init__()方法,那么Python解释器会调用默认的__init__()方法。_init__()方法按照参数的有无(self除外)可以分为有参数的的构造方法和无参数的构造方法,无参数的构造方法创建对象时可以为对象的属性设置默认的初始值。若希望每次创建对象时可以为对象设置个性化的初始值,则可以使用有参数的构造方法实现。构造方法定义的格式如下。9.3.1构造方法391def__init__(self,其他参数):2#方法体例如,定义一个类Person,在该类中显式地定义一个带3个参数的_init__()方法和Introduce()方法。运行代码后输出以下结果。姓名:Bob年龄:309.3.1构造方法401classPerson:2def__init__(self,name,age):3=name4self.age=age5

6defIntroduce(self):7print(f"姓名:{}")8print(f"年龄:{self.age}")9

10#创建Person类的实例11person=Person("Bob",30)12person.Introduce()9.3.2析构方法41理解析构方法的概念,掌握如何正确使用析构方法

先定一个小目标!析构方法(__del__())是一个在对象不再使用时自动调用的特殊方法。它通常用于执行清理操作,如释放资源或执行其他必要的收尾工作。在Python中,由于采用了垃圾回收机制,析构方法的调用时机是不确定的,因此通常不建议在析构方法中执行重要的清理工作。Python的垃圾回收器会在对象不再被引用时自动释放其占用的内存,因此大多数情况下不需要手动释放资源。尽管如此,如果确实需要在对象销毁时执行某些操作(尽管这种情况很少见),可以在类中定义__del__()方法。析构方法定义的格式如下。9.3.2析构方法421def__del__(self,其他参数):2#方法体例如,定义析构方法。9.3.2析构方法431classCar:2def__init__(self,color):3self.color=color4print("调用__init__方法,车辆已创建,颜色为:",self.color)5

6def__del__(self):7print("调用__del__方法,车辆已被销毁")8#主程序9

10car1=Car("红色")11car2=Car('蓝色')12car3=car2现在是car2的引用,它们指向同一个对象13print("准备删除car1")14delcar1删除car1的引用,但对象可能不会被立即销毁,因为还有其他引用存在15print("准备删除car2")16delcar2删除car2的引用,此时对象应该还不会被销毁,因为car3还在引用它17print("准备删除car3")18delcar3删除car3的引用,此时对象没有任何引用,所以会被销毁运行代码后输出以下结果。调用__init__方法,车辆已创建,颜色为:红色调用__init__方法,车辆已创建,颜色为:蓝色准备删除car1调用__del__方法,车辆已被销毁准备删除car2准备删除car3调用__del__方法,车辆已被销毁9.3.2析构方法449.4类方法和静态方法9.4.1类方法46掌握类方法如何定义和调用

先定一个小目标!类方法与实例方法的不同之处如下。(1)类方法是通过装饰器@classmethod修饰。(2)类方法的第一个参数通常是cls,而非self,它代表类本身而不是类的实例。(3)类方法既可以由类的实例对象调用,也可以通过类名直接调用。(4)类方法可以修改类属性,实例方法无法修改类属性。9.4.1类方法47定义类方法的语法如下。类方法可以通过类名或对象名进行调用,其语法格式如下。9.4.1类方法481classMyClass:2@classmethod3defmy_class_method(cls):4#方法体1类名.类方法2对象名.类方法定义一个含有类方法my_class_method()的类MyClass。9.4.1类方法491classMyClass:2count=03@classmethod4defmy_class_method(cls):类方法5cls.count=cls.count+267definstance_method(self):实例方法8self.count=19

10#主程序11a1=MyClass()创建MyClass类的对象a112a1.instance_method()通过对象名a1调用实例方法修改类属性count的值13print(MyClass.count)输出类属性count的值14a1.my_class_method()对象名调用类方法15print(MyClass.count)输出类属性count的值16MyClass.my_class_method()类名调用类方法17print(MyClass.count)输出类属性count的值9.4.2静态方法50掌握静态方法如何定义和调用

先定一个小目标!静态方法与实例方法的不同之处如下。(1)静态方法需要使用@staticmethod来修饰。(2)静态方法既不接收self(表示实例)也不接收cls(表示类)作为第一个参数。(3)静态方法中需要以“类名.方法/属性名”的形式方位类的成员。(4)静态方法既可以由对象调用,也可以通过类名调用。9.4.2静态方法51定义静态方法的语法如下。静态方法的使用9.4.2静态方法521classMyClass:2@staticmethod3defmy_static_method(*args,**kwargs):4#方法体1classMyClass2:2num=53@staticmethod4defmy_static_method():5print(f"类属性的值为:{MyClass2.num}")6

7#主程序8mc=MyClass2()创建对象9mc.my_static_method()对象调用静态方法10MyClass2.my_static_method()类名调用静态方法9.5应用案例应用案例:超市管理系统为了提高超市运营效率和服务质量,开发一个基于面向对象编程的超市管理系统是非常有意义的。超市管理系统代码运行结果,如图所示。54思考:如何编程实现上述功能呢?

【分析】(1)明确该程序是利用面向对象编程的基本概念,设计和实现一个简单的超市管理系统。其系统包括两个核心类:Product(商品)和Customer(顾客)。商品类负责管理商品的基本信息和库存,顾客类负责模拟顾客的购物行为。(2)定义Product类:包括商品的名称、价格和库存数量等属性,以及展示商品信息和售出商品的方法。通过Product类将数据和方法封装在一起,实现数据隐藏和保护。(3)定义Customer类:包括顾客的名称和购物车,以及添加商品到购物车和结账购物车的方法。通过Customer类将数据和方法封装在一起,实现数据隐藏和保护。(4)根据Product类和Customer类模拟顾客选择商品、加入购物车、结账购物车的整个过程。应用案例:超市管理系统55【实现】自定义Product类;应用案例:超市管理系统561classProduct:2def__init__(self,name,price,quantity):3"""4初始化商品对象5name:商品名称6price:商品单价7quantity:商品库存数量8"""9=name设置商品名称10self.price=price设置商品单价11self.quantity=quantity设置商品库存数量12

【实现】自定义Product类;应用案例:超市管理系统5713#自定义显示商品信息函数14defdisplay_info(self):15print(f"商品名称:{},单价:${self.price},库存数量:{self.quantity}")16

17defsell(self,amount):18"""19自定义售出商品函数20amount:售出数量21"""22ifself.quantity>=amount:如果库存数量大于等于要售出的数量23self.quantity-=amount减少库存数量,表示售出了指定数量的商品24print(f"成功售出{amount}个{}")25else:26print(f"库存不足,无法售出{amount}个{}")【实现】自定义Customer类;应用案例:超市管理系统581classCustomer:2def__init__(self,name):3"""初始化顾客对象4name:顾客名称5

"""6

=name7

self.cart=[]初始化购物车为空列表8

9

defadd_to_cart(self,product,quantity):10

"""添加商品到购物车11

product:要添加的商品对象12

quantity:添加的数量13

"""14

self.cart.append((product,quantity))15print(f"{}添加了{quantity}个{}到购物车")【实现】自定义Customer类;应用案例:超市管理系统591617

#自定义结账购物车商品函数18

defcheckout(self):19

total_cost=0初始化总费用为020

print(f"---{}的购物车---")打印购物车所有者的名称21

forproduct,quantityinself.cart:遍历购物车中的每个商品及其数量22

ifproduct.quantity>=quantity:检查商品库存是否足够23

product.sell(quantity)调用商品对象的售出方法,减少商品库存24

total_cost+=product.price*quantity计算总费用25

else:26

print(f"{}库存不足")如果商品库存不足,打印库存不足信息27

print(f"总费用:${total_cost}")打印结账后的总费用28

self.cart=[]结账后清空购物车【实现】创建示例;应用案例:超市管理系统601#创建Product和Customer示例2

if__name__=="__main__":3

面包=Product("面包",2.5,50)创建商品对象,名称为"面包",单价为2.5,库存数量为504

牛奶=Product("牛奶",3.0,30)创建商品对象,名称为"牛奶",单价为3.0,库存数量为305

6

张三=Customer("张三")创建顾客张三7

王五=Customer("王五")创建顾客王五【实现】购物流程示例。应用案例:超市管理系统611

张三.add_to_cart(面包,3)张三将3个面包添加到购物车2

张三.add_to_cart(牛奶,2)张三将2瓶牛奶添加到购物车3

4

王五.add_to_cart(牛奶,3)王五将3瓶牛奶添加到购物车5

6

张三.checkout()张三结账购物车中的商品7

王五.checkout()王五结账购物车中的商品8

9

面包.display_info()显示面包商品的剩余库存信息10

牛奶.display_info()显示牛奶商品的剩余库存信息9.6类的继承9.6.1单继承63理解什么是单继承,掌握单继承类的定义

先定一个小目标!单继承指的是子类只继承一个父类,其语法格式如下。9.6.1单继承641class子类(父类):定义一个表示动物的类Animal和一个表示狗的子类Dog。9.6.1单继承651classAnimal:2def__init__(self,name):3

=name4

5

defspeak(self):6

print(f"{}makesasound")7

8#子类Dog继承自父类Animal9classDog(Animal):10

defbark(self):11

print(f"{}barks")12

13#创建Dog类的实例14dog=Dog("Buddy")15#调用继承自Animal的speak方法16dog.speak()输出:Buddymakesasound17#调用Dog类特有的bark方法18

dog.bark()输出:Buddybarks9.6.2多继承66理解什么是多继承,掌握多继承类的定义

先定一个小目标!多继承是指一个子类(派生类)可以同时继承自多个父类(基类),其语法格式如下。9.6.2多继承671class子类(父类A,父类B):多继承的例子随处可见,例如哺乳动物类Mammal和鸟类Bird,假设蝙蝠同时具有哺乳动物和鸟类的特征,因此让蝙蝠类Bat同时继承自Mammal和Bird类。9.6.2多继承681classAnimal:2def__init__(self,name):3

=name4

5

defspeak(self):6

print(f"{}makesasound")7

8classMammal(Animal):#定义哺乳动物类,继承自Animal类9

defnurse_young(self):10

print(f"{}nursesitsyoung")11

12classBird(Animal):#定义鸟类,继承自Animal类13

deffly(self):14

print(f"{}canfly")159.6.3方法的重写69理解什么是重写,掌握如何进行方法的重写

先定一个小目标!在继承关系中,子类会自动拥有父类定义的方法。如果父类定义的方法不能满足子类的需求,子类可以按照自己的需要重写从父类继承的方法,这就是方法的重写(Override)。重写使得子类中的方法覆盖掉与父类同名的方法,需要注意的是,在子类中重写的方法要和父类被重写的方法具有相同的方法名和参数列表。在下面的例子中,子类Dog和Cat都重写了父类Animal中的speak()方法。9.6.3方法的重写701classAnimal:2def__init__(self,name):3

=name4

5

defspeak(self):6

print(f"The{}makesasound")7

8#子类Dog继承自Animal并重写speak方法9classDog(Animal):10

defspeak(self):11

print(f"The{}barks")9.6.3方法的重写7112#子类Cat也继承自Animal并重写speak方法13classCat(Animal):14defspeak(self):15

print(f"The{}meows")16

17#创建Dog和Cat的实例18dog=Dog("Buddy")19cat=Cat("Whiskers")20#调用各自对象的speak方法,将执行子类重写后的方法21dog.speak()#输出:TheBuddybarks22cat.speak()#输出:TheWhiskersmeows23#如果创建一个Animal的实例并调用speak方法,将执行Animal类中的方法24animal=Animal("GenericAnimal")25animal.speak()#输出:TheGenericAnimalmakesasound如果子类重写了父类的方法,但仍然希望调用父类中的方法,此时,可以通过super()函数调用父类(或超类)中的方法。这在子类重写父类方法时特别有用,它允许子类在重写的方法中调用父类的原始实现,从而可以扩展或修改父类的行为,而不是完全替代它。super()函数的语法格式如下。9.6.3方法的重写721super().方法名()9.6.3方法的重写731classAnimal:2def__init__(self,name):3

=name4

5

defspeak(self):6

print(f"The{}makesasound")7

8#子类Dog继承自Animal,并重写speak方法,使用super()调用父类的speak方法9classDog(Animal):10

defspeak(self):11

super().speak()调用父类的speak方法12

print(f"The{}barksspecifically")13#创建Dog的实例14dog=Dog("Buddy")15#调用dog的speak方法,将先执行父类的speak方法,再执行子类添加的部分16dog.speak()9.7多态9.7多态75理解多态,掌握如何实现多态。

先定一个小目标!在设计一个方法时,有时会希望该方法具备一定的通用性。例如,要实现动物类的叫声方法speak(),由于不同类型动物的叫声是不同的,因此可以在方法中设置一个参数,当speak()方法传入Dog类的对象作为参数时,就模拟狗叫,当speak()方法传入Cat类的对象作为参数时,就模拟猫叫。这种同一个方法(方法名相同),由于参数类型或参数个数不同而导致执行效果不同的现象叫多态(Polymorphism)。9.7多态76使用Animal类及其子类来演示多态的示例9.7多态771classAnimal:2defspeak(self):3

print("Theanimalmakesasound")4

5classDog(Animal):6

defspeak(self):7

print("Thedogbarks")8

9classCat(Animal):10

defspeak(self):11

print("Thecatmeows")12

13#定义一个函数,接受Animal类型的参数,并调用其speak方法14deflet_animal_speak(animal):15animal.speak()16使用Animal类及其子类来演示多态的示例9.7多态7817#创建Dog和Cat的实例18dog=Dog()19cat=Cat()20#使用多态,将Dog和Cat的实例传递给接受Animal类型参数的函数21let_animal_speak(dog)22let_animal_speak(cat)9.8应用案例应用案例:太空探索游戏一支由专业宇航员、工程师和探险家组成的太空探索团队,每个角色都有独特的科学技能和任务目标,宇航员正在驾驶宇宙飞船探索未知星球,工程师设计并测试新型宇宙探测器,探险家正在探索宇宙奥秘。该案例可以体验面向对象编程在游戏开发中的应用和乐趣。太空探索游戏代码运行结果如图所示。80思考:如何编程实现上述功能呢?

【分析】(1)抽象类和具体类的设计SpaceExplorer类:这是一个抽象基类,用于表示太空探险角色。SpaceExplorer类中实现explore()方法,用于执行具体的探索行为。这个类本身不能被实例化,而是被其他具体角色类继承和实现。具体角色类(Astronaut,Explorer,Engineer):每个具体角色类继承自SpaceExplorer类,并且实现explore()方法以展示不同的探索行为。这些类封装了每种角色的特定技能,例如宇航员驾驶宇宙飞船、探险家寻找宝藏和工程师维护工具。应用案例:太空探索游戏81

【分析】(2)游戏界面函数game_interface的设计欢迎消息和用户输入:游戏开始时,打印欢迎消息并提示用户输入角色名称和角色类型。角色选择和对象实例化:根据用户输入的角色类型,实例化相应的具体角色对象(Astronaut、Explorer、Engineer)。这种实例化利用了多态性,即不同的对象可以通过相同的方法调用来执行不同的行为。游戏循环:进入一个循环,允许玩家选择不同的操作。操作选择:玩家可以选择探索未知星球或退出游戏。根据玩家的选择,调用相应角色对象的explore()方法或退出游戏循环。(3)主程序入口的设计main函数:在主程序入口,调用game_interface函数来启动游戏。game_interface函数负责整个游戏的流程,包括角色选择、操作执行和游戏循环。应用案例:太空探索游戏82【实现】自定义基类SpaceExplorer;应用案例:太空探索游戏831#定义太空探险角色基类2classSpaceExplorer:3def__init__(self,name):4

=name初始化角色的名称5

"""6

在太空探索游戏程序中:7

self表示类的实例对象自身,可以通过self来访问和操作当前对象的属性和方法8

name是用来初始化对象的属性的值9

"""10

11

defexplore(self):12

pass抽象方法,由子类实现具体的探索行为【实现】自定义子类Astronaut、Explorer和Engineer;应用案例:太空探索游戏841#定义宇航员类2classAstronaut(SpaceExplorer):3def__init__(self,name):4super().__init__(name)调用父类的初始化方法,设置角色的名称5

6defexplore(self):自定义一个类方法,用于执行太空探险角色的探索行为7print(f"{}正在驾驶宇宙飞船探索未知星球。")实现了太空探险的具体行为8

9#定义探险家类10classExplorer(SpaceExplorer):11def__init__(self,name):12super().__init__(name)调用父类的初始化方法,设置角色的名称【实现】自定义子类Astronaut、Explorer和Engineer;应用案例:太空探索游戏851314

defexplore(self):自定义一个类方法,用于执行太空探险角色的探索行为15

print(f"{}正在探寻宇宙奥秘。")实现了太空探险的具体行为16

17#定义工程师类18classEngineer(SpaceExplorer):19

def__init__(self,name):20

super().__init__(name)调用父类的初始化方法,设置角色的名称21

22defexplore(self):自定义一个类方法,用于执行太空探险角色的探索行为23print(f"{}正在维护和改进探险工具。")实现了太空探险的具体行为【实现】设计用户界面和游戏交互函数;应用案例:太空探索游戏861#用户界面函数2defgame_interface():3print("欢迎进入太空探险游戏!")4

name=input("请输入您的角色名称:")获取用户输入的角色名称5

role_type=input("请选择角色类型(1.宇航员2.探险家3.工程师):")获取用户选择6

7

ifrole_type=="1":8

player=Astronaut(name)根据用户选择创建相应的角色实例9

elifrole_type=="2":10

player=Explorer(name)11

elifrole_type=="3":12

player=Engineer(name)【实现】设计用户界面和游戏交互函数;应用案例:太空探索游戏8713else:14

print("无效的角色类型选择。")15

return16

17

print(f"您选择了角色{},开始太空探险之旅!")打印角色选择信息18

19

whileTrue:20

print("\n请选择操作:")21

print("1.探索未知星球")22

print("2.退出游戏")23

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论