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
self.number_served = 0
def describe_restaurant(self):
"""描述餐馆信息"""
print(self.restaurant_name)
print(self.cuisine_type)
def open_restaurant(self):
"""餐馆正在营业"""
print("The restaurant is opening.")
def served_number(self):
"""打印服务人数"""
print("The served_numbers are " + str(self.number_served) + ".")
def set_number_served(self, number):
self.number_served = number
def increment_number_served(self, number):
self.number_served += number
class IceCreamStand(Restaurant):
def __init__(self, restaurant_name, cuisine_type):
super().__init__(restaurant_name, cuisine_type)
self.flavors = "Strawberry"
def describe_flavors(self):
print(self.flavors)
restaurant = IceCreamStand('henry', 'chinese')
restaurant.describe_flavors()
Strawberry
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(self.first_name)
print(self.last_name)
def greet_user(self):
"""问候用户"""
long_name = self.first_name.title() + " " + self.last_name.title() + "!"
print("Hello, " + long_name)
class Admin(User):
def __init__(self, first_name, last_name):
super().__init__(first_name, last_name)
self.privileges = ["can add post", "can delete post", "can ban user"]
def show_privileges(self):
for privilege in self.privileges:
print("Admin " + privilege + "!")
user = Admin("he", "henry")
user.describe_user()
user.greet_user()
user.show_privileges()
结果:
he
henry
Hello, He Henry!
Admin can add post!
Admin can delete post!
Admin can ban user!
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(self.first_name)
print(self.last_name)
def greet_user(self):
"""问候用户"""
long_name = self.first_name.title() + " " + self.last_name.title() + "!"
print("Hello, " + long_name)
class Privileges():
def __init__(self):
self.privileges = ["can add post", "can delete post", "can ban user"]
def show_privileges(self):
for privilege in self.privileges:
print("Admin " + privilege + "!")
class Admin(User):
def __init__(self, first_name, last_name):
super().__init__(first_name, last_name)
# 将一个 Privileges 实例用作其属性
self.privileges = Privileges()
admin = Admin("henry", "he")
admin.privileges.show_privileges()
Admin can add post!
Admin can delete post!
Admin can ban user!
9-9 电瓶升级 :在本节最后一个 electric_car.py 版本中,给 Battery 类添加一个名为 upgrade_battery() 的方法。这个方法检查电瓶容量,如果它不是 85 ,就将它设置为 85 。创建一辆电瓶容量为默认值的电动汽车,调用方法 get_range() ,然后对电瓶进行升级,并再次调用 get_range() 。你会看到这辆汽车的续航里程增加了。
class Car():
"""初始化描述汽车信息"""
def __init__(self, make, model, year):
self.make = make
self.model = model
self.year = year
self.odometer_reading = 15
def get_descriptive_name(self):
"""返回整洁的信息描述"""
long_name = str(self.year) + ' ' + self.make + ' ' + self.model
return long_name.title()
def read_odometer(self):
"""打印一条汽车里程信息"""
print("This car has " + str(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=70):
""" 初始化电瓶的属性 """
self.battery_size = battery_size
def describe_battery(self):
""" 打印一条描述电瓶容量的消息 """
print("This car has a " + str(self.battery_size) + "-kWh battery.")
def get_range(self):
""" 打印一条消息,指出电瓶的续航里程 """
if self.battery_size == 70:
range = 240
elif self.battery_size == 85:
range = 270
message = "This car can go approximately " + str(range)
message += " miles on a full charge."
print(message)
def upgrade_battery(self):
if self.battery_size != 85:
self.battery_size = 85
class ElectricCar(Car):
""" 电动汽车的独特之处 """
def __init__(self, make, model, year):
super().__init__(make, model, year)
self.battery = Battery()
my_tesla = ElectricCar('tesla', 'model s', 2016)
print(my_tesla.get_descriptive_name())
my_tesla.battery.describe_battery()
my_tesla.battery.get_range()
my_tesla.battery.upgrade_battery()
my_tesla.battery.get_range()
2016 Tesla Model S
This car has a 70-kWh battery.
This car can go approximately 240 miles on a full charge.
This car can go approximately 270 miles on a full charge.
9-13 使用 OrderedDict :在练习 6-4 中,你使用了一个标准字典来表示词汇表。请使用 OrderedDict 类来重写这个程序,并确认输出的顺序与你在字典中添加键— 值对的顺序一致。
from collections import OrderedDict
dictionary = OrderedDict()
dictionary['if'] = '条件语句'
dictionary['for'] = '循环语句'
dictionary['else'] = '分支跳转'
dictionary['print'] = '打印信息'
for key, value in dictionary.items():
print("\nkey: " + key)
print("value: " + value)
key: if
value: 条件语句
key: for
value: 循环语句
key: else
value: 分支跳转
key: print
value: 打印信息
9-14 骰子 :模块 random 包含以各种方式生成随机数的函数,其中的 randint() 返回一个位于指定范围内的整数,例如,下面的代码返回一个 1~6 内的整数:
from random import randint
x = randint(1, 6)
请创建一个 Die 类,它包含一个名为 sides 的属性,该属性的默认值为 6 。编写一个名为 roll_die() 的方法,它打印位于 1 和骰子面数之间的随机数。创建一个 6 面的骰子,再掷 10 次。 创建一个 10 面的骰子和一个 20 面的骰子,并将它们都掷 10 次。
class Die():
def __init__(self, sides=6):
self.sides = sides
self.num = 0
def roll_die(self):
self.num = randint(1, self.sides)
print(self.num)
die_roll = Die()
die_roll.roll_die()
die_roll = Die(10)
die_roll.roll_die()
die_roll = Die(20)
die_roll.roll_die()