|
在Python中,面向对象编程(Object-OrientedProgramming,简称OOP)是一种编程范式或编程风格,它使用“对象”来设计应用程序和程序。面向对象的主要概念包括类、对象、继承、封装和多态,这里主要介绍下Python中关于类(Class)的操作。在Python中,类是创建对象的蓝图或模板,类定义了对象的属性和方法,对象是类的实例。这里使用了埃里克.马瑟斯著的《Python编程:从入门到实践》中的小节练习作为案例 1.创建和使用类在Python中使用class关键字来定义类。练习题1:餐馆 创建一个一个名为Restaurant的类,为其方法__init__()设置属性restaurant_name和cuisine_type。创建一个名为describe_restaurant()的方法和一个名为open_restaurant()的方法,前者打印前述两项信息,而后者打印一条消息,指出餐馆正在营业。根据这个类创建一个名为restaurant的实例,分别打印其两个属性,再调用前述两个方法。"""创建一个名为Restaurant的类,为其方法__init__()设置属性restaurant_name和cuisine_type。"""classRestaurant:def__init__(self,restaurant_name,cuisine_type):self.restaurant_name=restaurant_nameself.cuisine_type=cuisine_type"""创建一个名为describe_restaurant()的方法和一个名为open_restaurant()的方法,前者打印前述两项信息,而后者打印一条消息,指出餐馆正在营业。"""defdescribe_restaurant(self):print(f"{self.restaurant_name}")print(f"{self.cuisine_type}")defopen_restaurant(self):print(f"{self.restaurant_name}")#根据Restaurant类创建一个名为restaurant的实例restaurant=Restaurant("老八餐厅","奥利给")#分别打印其两个属性print(f"{restaurant.restaurant_name}")print(f"{restaurant.cuisine_type}")#调用describe_restaurant()方法restaurant.describe_restaurant()#调用open_restaurant()方法restaurant.open_restaurant()'运行运行练习题2:三家餐馆 根据习题1编写的类创建三个实例,并对每个实例调用方法describe_restaurant()。#调用习题1中创建的Restaurant类from餐馆importRestaurant#创建三个Restaurant类的实例restaurant1=Restaurant("老八餐厅","奥利给")restaurant2=Restaurant("老八大餐","奥利给")restaurant3=Restaurant("老八天堂","奥利给")#对每个实例调用describe_restaurant()方法restaurant1.describe_restaurant()restaurant2.describe_restaurant()restaurant3.describe_restaurant()习题3:用户 创建一个名为User的类,其中包含属性first_name和last_name,以及用户简介通常会存储的其他几个属性。在类User中定义一个名为describe_user()的方法,用于打印用户信息摘要。再定义一个名为greet_user()的方法,用于向用户发出个性化的问候。创建多个表示不同用户的实例,并对每个实例调用上述两个方法。classUser:def__init__(self,first_name,last_name):self.first_name=first_nameself.last_name=last_namedefdescribe_user(self):print(f"欢迎{self.first_name}{self.last_name}来到老八餐厅!")defgreet_user(self):print(f"你好,{self.first_name}{self.last_name}!祝您用餐愉快!")user1=User("张三","李四")user2=User("王五","赵六")user3=User("孙七","周八")#对每个实例调用describe_user()和greet_user()方法users=[user1,user2,user3]foruserinusers:user.describe_user()user.greet_user()print()'运行运行2.使用类和实例 当定义了一个类时,可以创建它的实例,并访问它的属性和方法习题4:就餐人数 在为完成练习1而编写的程序中,添加一个名为number_served的属性,并将其默认值设置为0。根据这个类创建一个名为restaurant的实例。打印有多少人在这家餐馆就餐过,然后修改这个值并再次打印它。添加一个名为set_number_served()的方法,让你能够设置就餐人数。调用这个方法并向它传递一个值,然后再次打印这个值。添加一个名为increment_number_served()的方法,让你能够将就餐人数递增。调用这个方法并向它传递一个这样的值:你认为这家餐馆每天可能接待的就餐人数。#在餐厅.py上进行修改classRestaurant:def__init__(self,restaurant_name,cuisine_type):self.restaurant_name=restaurant_nameself.cuisine_type=cuisine_typeself.number_served=0defdescribe_restaurant(self):print(f"餐厅名称:{self.restaurant_name}")print(f"菜系类型:{self.cuisine_type}")defset_number_served(self,number):self.number_served=numberprint(f"在{self.restaurant_name}就餐的人数已设置为:{self.number_served}")defincrement_number_served(self,increment_by):self.number_served+=increment_byprint(f"在{self.restaurant_name}就餐的人数已增加{increment_by}人,当前总人数:{self.number_served}")defget_number_served(self):print(f"至今已有{self.number_served}人在{self.restaurant_name}用餐。")#根据Restaurant类创建一个名为restaurant的实例restaurant=Restaurant("老八餐厅","奥利给")#分别打印其两个属性print(f"餐厅名称:{restaurant.restaurant_name}")print(f"菜系类型:{restaurant.cuisine_type}")#调用方法restaurant.describe_restaurant()restaurant.get_number_served()restaurant.set_number_served(20)restaurant.get_number_served()restaurant.increment_number_served(5)restaurant.get_number_served()'运行运行习题5:尝试登录次数 在为完成练习3而编写的User类中,添加一个名为login_attempts的属性。编写一个名为increment_login_attempts()的方法,将属性login_attempts的值加1。再编写一个名为reset_login_attempts()的方法,将属性login_attempts的值重置为0。根据User类创建一个实例,再调用方法increment_login_attempts()多次。打印属性login_attempts的值,确认它被正确地递增。然后,调用方法reset_login_attempts(),并再次打印属性login_attempts的值,确认它被重置为0。#在用户.py上进行修改classUser:def__init__(self,first_name,last_name):self.first_name=first_nameself.last_name=last_nameself.login_attempts=0defdescribe_user(self):print(f"欢迎{self.first_name}{self.last_name}来到老八餐厅!")defgreet_user(self):print(f"你好,{self.first_name}{self.last_name}!祝您用餐愉快!")defincrement_login_attempts(self):self.login_attempts+=1defreset_login_attempts(self):self.login_attempts=0defprint_login_attempts(self):print(f"{self.first_name}{self.last_name}的登录尝试次数:{self.login_attempts}")#创建实例user1=User("老八","八妹")#调用increment_login_attempts()方法多次user1.increment_login_attempts()user1.increment_login_attempts()user1.increment_login_attempts()#打印login_attempts的值user1.print_login_attempts()#调用reset_login_attempts()方法user1.reset_login_attempts()#再次打印login_attempts的值,确认它已经重置为0user1.print_login_attempts()'运行运行3.继承在Python中,一个类可以继承另一个类的属性和方法,被称为继承。被继承的类称为父类(或基类),继承的类称为子类(或派生类)。 习题6:冰激凌小店 冰激凌小店是一种特殊的餐馆。编写一个名为IceCreamStand的类,让它继承为完成练习9-1或练习9-4而编写的Restaurant类。这两个版本的Restaurant类都可以,挑选你更喜欢的那个即可。添加一个名为flavors的属性,用于存储一个由各种口味的冰激凌组成的列表。编写一个显示这些冰激凌的方法。创建一个IceCreamStand实例,并调用这个方法。#修改自餐馆.pyclassRestaurant:def__init__(self,restaurant_name,cuisine_type):self.restaurant_name=restaurant_nameself.cuisine_type=cuisine_typedefdescribe_restaurant(self):print(f"餐厅名称:{self.restaurant_name}")print(f"菜式类型:{self.cuisine_type}")#继承Restaurant类classIceCreamStand(Restaurant):def__init__(self,restaurant_name,flavors):#调用父类的初始化方法super().__init__(restaurant_name,"冰淇淋")#添加flavors属性self.flavors=flavorsdefdisplay_flavors(self):print(f"{self.restaurant_name}的冰淇淋口味:")forflavorinself.flavors:print(f"-{flavor}")#创建一个IceCreamStand实例ice_cream_stand=IceCreamStand("老八之家",["臭豆腐味","火鸡面味","大辣椒味","朱老六味"])#调用父类继承的方法ice_cream_stand.describe_restaurant()#调用新添加的方法来显示冰淇淋口味ice_cream_stand.display_flavors()'运行运行习题7:管理员 管理员是一种特殊的用户。编写一个名为Admin的类,让它继承为完成练习3或练习5而编写的User类。添加一个名为privileges的属性,用于存储一个由字符串(如"canaddpost"、"candeletepost"、"canbanuser"等)组成的列表。编写一个名为show_privileges()的方法,显示管理员的权限。创建一个Admin实例,并调用这个方法。from用户importUser#继承User类创建Admin类classAdmin(User):def__init__(self,first_name,last_name):super().__init__(first_name,last_name)#调用父类的构造函数self.privileges=[#添加privileges属性"canaddpost","candeletepost","canbanuser"]#添加show_privileges方法defshow_privileges(self):print(f"{self.first_name}{self.last_name}的权限有:")forprivilegeinself.privileges:print(f"-{privilege}")#创建一个Admin实例并调用方法admin=Admin("管理员","张三")admin.describe_user()admin.greet_user()admin.show_privileges()习题8:权限 编写一个名为Privileges的类,它只有一个属性privileges,其中存储了练习7所述的字符串列表。将方法show_privileges()移到这个类中。在Admin类中,将一个Privileges实例用作其属性。创建一个Admin实例,并使用方法show_privileges()来显示其权限。classPrivileges:def__init__(self):self.privileges=["canaddpost","candeletepost","canbanuser"]defshow_privileges(self,first_name,last_name):print(f"{first_name}{last_name}的权限有:")forprivilegeinself.privileges:print(f"-{privilege}")classUser:def__init__(self,first_name,last_name):self.first_name=first_nameself.last_name=last_namedefdescribe_user(self):print(f"{self.first_name}{self.last_name}")defgreet_user(self):print(f"Hello,{self.first_name}{self.last_name}!")classAdmin(User):def__init__(self,first_name,last_name):super().__init__(first_name,last_name)self.privileges=Privileges()defshow_privileges(self):self.privileges.show_privileges(self.first_name,self.last_name)admin=Admin("管理员","张三")admin.describe_user()admin.greet_user()admin.show_privileges()'运行运行习题9:电瓶升级在书中有一份electric_car.py文件,我这里直接进行了修改,给Battery类添加一个名为upgrade_battery()的方法。该方法检查电瓶容量,如果不是100,就将其设置为100。创建一辆电瓶容量为默认值的电动汽车,调用方法get_range(),然后对电瓶进行升级,并再次调用get_range()。你将看到这辆汽车的续航里程增加了。classCar:def__init__(self,make,model,year):self.make=makeself.model=modelself.year=yearself.odometer_reading=0defget_descriptive_name(self):long_name=f"{self.year}{self.make}.{self.model}"returnlong_name.title()defread_odometer(self):print(f"Thiscarhas{self.odometer_reading}milesonit.")defupdate_odometer(self,mileage):ifmileage>=self.odometer_reading:self.odometer_reading=mileageelse:print("Youcan'trollbackanodometer!")defincrement_odometer(self,miles):self.odometer_reading+=milesclassBattery:def__init__(self,battery_size=75):self.battery_size=battery_sizedefdescribe_battery(self):print(f"Thiscarhasa{self.battery_size}-kWhbattery.")defget_range(self):ifself.battery_size==75:range=260elifself.battery_size==100:range=315print(f"Thiscarcangoabout{range}milesonafullcharge.")defupgrade_battery(self):ifself.battery_size!=100:self.battery_size=100classElectricCar(Car):def__init__(self,make,model,year):super().__init__(make,model,year)self.battery=Battery()defdescribe_battery(self):print(f"Thiscarhasa{self.battery_size}-kWhbattery.")deffill_gas_tank(self):print("Thiscardoesn'tneedagastank!")my_tesla=ElectricCar('tesla','models',2019)print(my_tesla.get_descriptive_name())#调用方法get_range()my_tesla.battery.get_range()#对电瓶进行升级my_tesla.battery.upgrade_battery()print(my_tesla.battery.describe_battery())#再次调用get_range()my_tesla.battery.get_range()'运行运行4.导入标准库模块Python标准库包含了许多有用的模块,这些模块中定义了许多类,可以使用import语句来导入这些模块,并使用其中的类。习题10:骰子 创建一个Die类,它包含一个名为sides的属性,该属性的默认值为6。编写一个名为roll_die()的方法,它打印位于1和骰子面数之间的随机数。创建一个6面的骰子再掷10次。创建一个10面的骰子和一个20面的骰子,再分别掷10次。fromrandomimportrandintclassDie:#按题目要求,建一个Die类,里面有一个默认值为6的sides属性,还有一个roll_die()方法用来摇骰子def__init__(self,sides=6):self.sides=sidesdefroll_die(self):roll=randint(1,self.sides)print(f"Rollingis:{roll}")returnrolldie=Die()die.roll_die()'运行运行习题11:彩票 创建一个列表或元组,其中包含10个数和5个字母。从这个列表或元组中随机选择4个数或字母,并打印一条消息,指出只要彩票上是这4个数或字母,就中大奖了。 importrandomGGboy=[1,2,3,4,5,6,7,8,9,10,'A','B','C','D','E']winning_numbers=random.sample(GGboy,4)print(f"彩票号码是{winning_numbers}。只要彩票上是这4个数或字母就中大奖.")'运行运行习题12:彩票分析 使用一个循环来明白前述彩票大奖有多难中奖。为此,创建一个名为my_ticket的列表或元组,再编写一个循环,不断地随机选择数或字母,直到中大奖为止。请打印一条消息,报告执行循环多少次才中了大奖。 importrandom#中奖号码和数字字母池、初始化计数器my_ticket=[1,2,"a","c"]GGboy=[1,2,3,'a','b','c','d']attempts=0whileTrue:attempts+=1selected_numbers=random.sample(GGboy,4)ifall(iteminmy_ticketforiteminselected_numbers):print(f"执行了{attempts}次循环后中大奖,中奖号码是{selected_numbers}。")break'运行运行
|
|