9-1 餐馆 创建一个名为Restaurant 的类,为其方法__init__() 设置属性restaurant_name 和cuisine_type。创建一个名为describe_restaurant()的方法和一个名为open_restaurant()的方法,前者打印前述两项信息,而后者打印一条消息,指出餐馆正在营业。
根据这个类创建一个名为restaurant的实例,分别打印其两个属性,再调用前述两个方法。
class Restaurant():
def __init__(self, restaurant_name,cuisine_type):
self.restaurant_name = restaurant_name
self.cuisine_type = cuisine_type
def describe_restaurant(self):
print(f'店名:{self.restaurant_name}')
print(f'烹调类型:{self.cuisine_type}')
def open_restaurant(self):
print(f'{self.restaurant_name}餐厅正在营业!')
restaurant = Restaurant('河边烧烤','烧烤')
restaurant.describe_restaurant()
restaurant.open_restaurant()
9-2 三家餐馆 根据为完成练习9-1而编写的类创建三个实例,并对每个实例调用方法describe_restaurant() 。
mc_restaurant = Restaurant("McDonald's",'fastfood')
kfc_restaurant = Restaurant('KFC','fastfood')
pizzhub_restaurant = Restaurant('Pizza Hub','pizza')
mc_restaurant.describe_restaurant()
kfc_restaurant.describe_restaurant()
pizzhub_restaurant.describe_restaurant()
9-3 用户 创建一个名为User 的类,其中包含属性first_name 和last_name ,以及用户简介通常会存储的其他几个属性。在类User 中定义一个名为describe_user()的方法,用于打印用户信息摘要。再定义一个名为greet_user()的方法,用于向用户发出个性化的问候。
创建多个表示不同用户的实例,并对每个实例调用上述两个方法。
class User():
"""docstring for User"""
def __init__(self, first_name,last_name,sex,hobby):
self.first_name = first_name
self.last_name = last_name
self.sex = sex
self.hobby = hobby
def describe_user(self):
print(f'名:{self.first_name}')
print(f'姓:{self.last_name}')
print(f'性别:{self.sex}')
print(f'爱好:{self.hobby}')
def greet_user(self):
print(f'Welcome {self.first_name}!')
user1 = User('Jimmy','Green','man','swimming')
user2 = User('Taylor','Swift','woman','music')
user1.describe_user()
user1.greet_user()
user2.describe_user()
user2.greet_user()
9-4 就餐人数 在为完成练习9-1而编写的程序中,添加一个名为number_served 的属性,并将其默认值设置为0。根据这个类创建一个名为restaurant 的实例。打印有多少人在这家餐馆就餐过,然后修改这个值并再次打印它。
class Restaurant():
def __init__(self, restaurant_name,cuisine_type):
self.restaurant_name = restaurant_name
self.cuisine_type = cuisine_type
self.number_served = 0
def describe_restaurant(self):
print(f'店名:{self.restaurant_name}')
print(f'烹调类型:{self.cuisine_type}')
def open_restaurant(self):
print(f'{self.restaurant_name}餐厅正在营业!')
# 添加一个名为set_number_served() 的方法,让你能够设置就餐人数。调用这个方法并向它传递一个值,然后再次打印这个值。
def set_number_served(self):
if self.number_served > 0:
print(f'就餐过人数:{self.number_served}')
else:
print(f'无就餐人数')
# 添加一个名为increment_number_served() 的方法,让你能够将就餐人数递增。调用这个方法并向它传递一个这样的值:你认为这家餐馆每天可能接待的就餐人数。
def increment_number_served(self,number):
if number > 0:
self.number_served += number
print(f'期望接待就餐人数:{self.number_served}')
else:
print(f'无期望接待人数')
restaurant = Restaurant('河边烧烤','烧烤')
restaurant.describe_restaurant()
restaurant.open_restaurant()
restaurant.number_served = 10
restaurant.set_number_served()
restaurant.increment_number_served(30)
9-5:尝试登录次数 在为完成练习9-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。
class User():
"""docstring for User"""
def __init__(self, first_name,last_name,sex,hobby):
self.first_name = first_name
self.last_name = last_name
self.sex = sex
self.hobby = hobby
self.login_attempts = 0
def describe_user(self):
print(f'名:{self.first_name}')
print(f'姓:{self.last_name}')
print(f'性别:{self.sex}')
print(f'爱好:{self.hobby}')
def greet_user(self):
print(f'Welcome {self.first_name}!')
#编写一个名为increment_login_attempts()的方法,将属性login_attempts 的值加1
def increment_login_attempts(self):
self.login_attempts += 1
# 编写一个名为reset_login_attempts()的方法,将属性login_attempts 的值重置为0
def reset_login_attempts(self):
self.login_attempts = 0
user = User('Jimmy','Green','man','swimming')
user.describe_user()
user.greet_user()
# 调用方法increment_login_attempts()
user.increment_login_attempts()
# 打印属性login_attempts的值
print(user.login_attempts)
# 调用方法reset_login_attempts()
user.reset_login_attempts()
# 将属性login_attempts 的值重置为0
print(user.login_attempts)
user1 = User('Taylor','Green','woman','music')
# 调用方法increment_login_attempts()多次
for i in range(1,5):
user1.increment_login_attempts()
# 打印属性login_attempts的值,确认它被正确地递增
print(f'调用第{user1.login_attempts}次!')
# 调用方法reset_login_attempts()
user1.reset_login_attempts()
# 打印属性login_attempts 的值,确认它被重置为0
print(f'重置为{user1.login_attempts}')
9-6 冰激凌小店 冰激凌小店是一种特殊的餐馆。编写一个名为IceCreamStand的类,让它继承为完成练习9-1或练习9-4而编写的Restaurant 类。这两个版本的Restaurant类都可以,挑选你更喜欢的那个即可。添加一个名为flavors的属性,用于存储一个由各种口味的冰激凌组成的列表。编写一个显示这些冰激凌的方法。创建一个IceCreamStand 实例,并调用这个方法。
class Restaurant():
def __init__(self, restaurant_name,cuisine_type):
self.restaurant_name = restaurant_name
self.cuisine_type = cuisine_type
def describe_restaurant(self):
print(f'店名:{self.restaurant_name}')
print(f'烹调类型:{self.cuisine_type}')
def open_restaurant(self):
print(f'{self.restaurant_name}餐厅正在营业!')
class IceCreamStand(Restaurant):
def __init__(self, restaurant_name,cuisine_type,flavors=[]):
super().__init__(restaurant_name,cuisine_type)
self.flavors = flavors
# 显示这些冰激凌的方法
def describe_flavors(self):
print(f'喜欢的冰淇淋:{self.flavors}')
icecream = IceCreamStand('河边冰淇淋屋','甜品',['巧克力','香草','奶茶'])
icecream.describe_flavors()
9-7 管理员 管理员是一种特殊的用户。编写一个名为Admin的类,让它继承为完成练习9-3或练习9-5而编写的User类。添加一个名为privileges的属性,用于存储一个由字符串(如"can add post" 、“can delete post” 、"can ban user"等)组成的列表。编写一个名为show_privileges()的方法,显示管理员的权限。创建一个Admin 实例,并调用这个方法。
class User():
def __init__(self, first_name,last_name):
self.first_name = first_name
self.last_name = last_name
def describe_user(self):
print(f'名:{self.first_name}')
print(f'姓:{self.last_name}')
def greet_user(self):
print(f'Welcome {self.first_name}!')
class Admin(User):
def __init__(self, first_name,last_name,privilege=[]):
super().__init__(first_name,last_name)
self.privileges = privilege
# 编写show_privileges(),显示管理员的权限
def show_privileges(self):
print(f'Admin:{str(self.privileges)}')
admin = Admin('Jimmy','Green',["can add post" ,"can delete post" "can ban user"])
admin.show_privileges()
9-8 权限 编写一个名为Privileges 的类,它只有一个属性privileges ,其中存储了练习9-7所述的字符串列表。将方法show_privileges()移到这个类中。在Admin 类中,将一个Privileges实例用作其属性。创建一个Admin 实例,并使用方法show_privileges() 来显示其权限。
class User():
def __init__(self, first_name,last_name):
self.first_name = first_name
self.last_name = last_name
def describe_user(self):
print(f'名:{self.first_name}')
print(f'姓:{self.last_name}')
def greet_user(self):
print(f'Welcome {self.first_name}!')
class Privileges():
def __init__(self,privilege=["can add post" ,"can delete post" "can ban user"]):
self.privileges = privilege
def show_privileges(self):
print(f'Admin:{str(self.privileges)}')
class Admin(User):
def __init__(self, first_name,last_name):
super().__init__(first_name,last_name)
self.privileges = Privileges()
admin = Admin('Jimmy','Green',)
admin.privileges.show_privileges()
9-9 电瓶升级 在本节最后一个electric_car.py版本中,给Battery 类添加一个名为upgrade_battery() 的方法。该方法检查电瓶容量,如果不是100,就将其设置为100。创建一辆电瓶容量为默认值的电动汽车,调用方法get_range(),然后对电瓶进行升级,并再次调用get_range()。你将看到这辆汽车的续航里程增加了。
class Car():
# 一次模拟汽车的简单尝试。
def __init__(self, make, model, year):
self.make = make
self.model = model
self.year = year
self.odometer_reading = 0
def get_descriptive_name(self):
long_name = f"{self.year} {self.make} {self.model}"
return long_name.title()
def read_odometer(self):
print(f"This car has {self.odometer_reading} miles on it.")
def update_odometer(self, mileage):
if mileage >= self.odometer_reading:
self.odometer_reading = mileage
else:
print("You can't roll back an odometer!")
def increment_odometer(self, miles):
self.odometer_reading += miles
class Battery():
# 一次模拟电动汽车电瓶的简单尝试。
def __init__(self, battery_size=75):
# 初始化电瓶的属性。
self.battery_size = battery_size
def describe_battery(self):
# 打印一条描述电瓶容量的消息。
print(f"This car has a {self.battery_size}-kWh battery.")
def get_range(self):
# 打印一条消息,指出电瓶的续航里程。
if self.battery_size == 75:
range = 260
elif self.battery_size == 100:
range = 315
msg = str(range)
print(f'续航里程:{msg}')
def upgrade_battery(self):
if self.battery_size != 100:
# 将100赋值给battery_size
self.battery_size =100
class ElectricCar(Car):
"""电动汽车的独特之处。"""
def __init__(self, make, model, year):
# 初始化父类的属性。
# 再初始化电动汽车特有的属性。
super().__init__(make, model, year)
self.battery = Battery()
my_tesla = ElectricCar('tesla', 'model s', 2019)
my_tesla.battery.get_range()
my_tesla.battery.upgrade_battery()
my_tesla.battery.get_range()
9-10 导入Restaurant 类 将最新的Restaurant类存储在一个模块中。在另一个文件中,导入Restaurant 类,创建一个Restaurant 实例并调用Restaurant 的一个方法,以确认import 语句正确无误。
from Restaurant import Restaurant
restaurant = Restaurant('河边烧烤','烧烤')
restaurant.describe_restaurant()
9-11 导入Admin 类 以为完成练习9-8而做的工作为基础。将User 类、Privileges类和Admin类存储在一个模块中,再创建一个文件,在其中创建一个Admin 实例并对其调用方法show_privileges() ,以确认一切都能正确运行。
from Admin import Admin
admin = Admin('Jimmy','Green',)
admin.privileges.show_privileges()
9-12 多个模块 将User 类存储在一个模块中,并将Privileges类和Admin 类存储在另一个模块中。再创建一个文件,在其中创建一个Admin实例并对其调用方法show_privileges() ,以确认一切依然能够正确运行。
from user import *
from admin import *
admin = Admin('Jimmy','Green',)
admin.privileges.show_privileges()
9-13 骰子 创建一个Die类,它包含一个名为sides的属性,该属性的默认值为6。编写一个名为roll_die()的方法,它打印位于1和骰子面数之间的随机数。创建一个6面的骰子再掷10次。
#创建一个10面的骰子和一个20面的骰子,再分别掷10次。
import random class Die(): """docstring for Die""" def __init__(self, sides=6): self.sides = sides def roll_die(self): # 打印位于1和骰子面数之间的随机数 print(random.randint(1,self.sides)) die = Die(10) # 一个10面的骰子掷10次 for n in range(1,11): print(f'10面骰子产生10次的随机数:') n = die.roll_die() die = Die(20) # 一个20面的骰子掷10次 for n in range(1,11): print(f'20面骰子产生10次的随机数:') n = die.roll_die()
9-14 彩票 创建一个列表或元组,其中包含10个数和5个字母。从这个列表或元组中随机选择4个数或字母,并打印一条消息,指出只要彩票上是这4个数或字母,就中大奖了。
import random
list1 = [0,1,2,3,4,5,6,7,8,9,'a','b','c','d','e']
print (list1)
for i in range(1,5):
i = random.choice(list1)
print(f'随机选择:{i}')
9-15 彩票分析 可以使用一个循环来明白前述彩票大奖有多难中奖。为此,创建一个名为my_ticket的列表或元组,再编写一个循环,不断地随机选择数或字母,直到中大奖为止。请打印一条消息,报告执行循环多少次才中了大奖。
import random
lottery = [10,35,44,55,64,78,89,92,'r','b','c','d','e']
print(lottery)
my_ticket = []
win_num = random.sample(lottery,5)
print(f'中奖号码:{win_num}')
i = 1
while True:
'''choice返回的是一个元素,choices返回的是一个列表,
且可能列表中的值会重复,sample返回的是一个列表,
单列表中的值不会重复'''
my_ticket = random.sample(lottery,k=5)
if my_ticket != win_num:
i += 1
continue
else:
# 报告执行循环多少次才中了大奖
print(f'第{i}次能够中奖!')
break



