'''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("The " + self.restaurant_name.title() + " is mainly engaged in " +
self.cuisine_type + ".")
def open_restaurant(self):
"""打印一条消息指出餐馆正在营业"""
print("The restaurant is open now.")
#创建实例
restaurant = Restaurant('elbow crispy','Tianjin cuisine')
#调用方法
restaurant.describe_restaurant()
restaurant.open_restaurant()
'''9-2 一家餐馆: 根据你为完成练习 9-1而编写的类创建一个实例,
并对该实例调用方法'''
restaurant_1 = Restaurant('salt-roasted chicken','Cantonese cuisine')
restaurant_1.describe_restaurant()
restaurant_1.open_restaurant()
'''9-3 用户:创建一个名为User的类,其中包含属性first_name 和last_name,
还有用户简介通常会存储的其他几个属性。在类User中定义一个名为describe_user()的方法,
它打印用户信息摘要;再定义一个名为greet_user( ) 的方法, 它向用户发出个性化的问候。
创建多个表示不同用户的实例, 并对每个实例都调用上述两个方法。'''
class User():
"""一次模拟用户列表的简单尝试"""
def __init__(self, first_name, last_name, location="Beijing"):
"""初始化描述用户信息的属性"""
self.first_name = first_name
self.last_name = last_name
self.location = location
self.field = 'Data Mining'
def describe_user(self):
"""打印用户信息摘要"""
info = self.first_name + " " + self.last_name + " " + self.location\
+ " " + self.field
return info.title()
def greet_user(self):
print("Hello, " + self.first_name.title() + " " +
self.last_name.title() + "!")
# c创建实例
user = User("albert", 'einstein')
# 调用方法
print(user.describe_user())
user.greet_user()
'''9-4 就餐人数:在为完成练习9-1而编写的程序中,添加一个名为number_served的属性,
并将其默认值设置为0。根据这个类创建一个名为restaurant 的实例;
打印有多少人在这家餐馆就餐过,然后修改这个值并再次打印它。
添加一个名为set_number_served( )的方法,它让你能够设置就餐人数。
调用这个方法并向它传递一个值, 然后再次打印这个值。
添加一个名为increment_number_served( )的方法,它让你能够将就餐人数递增。
调用这个方法并向它传递一个这样的值:你认为这家餐馆每天可能接待的就餐人数。'''
class Restaruant():
"""一次模拟餐馆的简单尝试"""
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("The " + self.restaurant_name.title() + " is mainly engaged in " +
self.cuisine_type + ".")
def open_restaurant(self):
"""打印一条消息指出餐馆正在营业"""
print("The restaurant is open now.")
def guests_number(self):
"""打印一条关于接待客人人数的消息"""
print('This restaurant has received ' + str(self.number_served) +
" guests.")
def set_number_served(self, a):
"""将接待过的客人人数设置为特定的值"""
if a >= self.number_served:
self.number_served += a
else:
print("Please try again.")
def increment_number_served(self, b):
"""将餐馆接待过的人数增加特定的值"""
print("I think " + restaurant.restaurant_name.title() +
" can accommodate " + str(b) + " guests today.")
self.number_served += b
# 创建实例
restaurant = Restaruant('elbow crispy', 'Tianjin cuisine')
# 调用方法
#打印有多少人在这家餐馆就餐过
restaurant.describe_restaurant()
restaurant.guests_number()
#然后修改这个值并再次打印它
restaurant.number_served = 1000
restaurant.guests_number()
#设置就餐人数,调用方法set_number_served()并向它传递一个值, 然后再次打印这个值
restaurant.set_number_served(2000)
restaurant.guests_number()
#调用方法increment_number_served(),并输出:你认为这家餐馆每天可能接待的就餐人数
restaurant.increment_number_served(200)
restaurant.guests_number()
'''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():
"""一次模拟用户列表的简单尝试"""
def __init__(self, first_name, last_name,login_attempts,location="Beijing"):
"""初始化描述用户信息的属性"""
self.first_name = first_name
self.last_name = last_name
self.login_attempts = login_attempts
self.location = location
self.field = 'Data Mining'
def describe_user(self):
"""打印用户信息摘要"""
info = self.first_name + " " + self.last_name + " " + self.location\
+ " " + self.field
return info.title()
def greet_user(self):
"""向用户发出问候"""
print("Hello, " + self.first_name.title() + " " +
self.last_name.title() + "!")
def increment_login_attempts(self):
"""将用户登录次数加1"""
self.login_attempts += 1
def reset_login_attempts(self):
"""将用户登录次数重新设置为0"""
if self.login_attempts != 0:
self.login_attempts = 0
#创建实例
user = User("albert",'einstein',0)
#调用方法
user.increment_login_attempts()
print(user.login_attempts)
user.increment_login_attempts()
print(user.login_attempts)
user.reset_login_attempts()
print(user.login_attempts)
'''9-6 冰淇淋小店:冰淇淋小店是一种特殊的餐馆。编写一个名为IceCreamStand的类,
让它继承你为完成练习 9-1或练习 9-4而编写的Restaurant 类。
这两个版本的Restaurant类都可以,挑选你更喜欢的那个即可。
添加一个名为flavors 的属性, 用于存储一个由各种口味的冰淇淋组成的列表。
编写一个显示这些冰淇淋的方法。创建一个IceCreamStand 实例, 并调用这个方法。'''
#父类
class Restaruant():
"""一次模拟餐馆的简单尝试"""
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("The " + self.restaurant_name.title() + " is mainly engaged in " +
self.cuisine_type + ".")
def open_restaurant(self):
"""打印一条消息指出餐馆正在营业"""
print("The restaurant is open now.")
def guests_number(self):
"""打印一条关于接待客人人数的消息"""
print('This restaurant has received ' + str(self.number_served) +
" guests.")
def set_number_served(self, a):
"""将接待过的客人人数设置为特定的值"""
if a >= self.number_served:
self.number_served += a
else:
print("Please try again.")
def increment_number_served(self, b):
"""将餐馆接待过的人数增加特定的值"""
print("I think " + restaruant.restaurant_name.title() +
" can accommodate " + str(b) + " guests today.")
self.number_served += b
#子类IceCreamStand
#方法一:用接受任意个实参的空元组做属性,但是number_served的值不能写
class IceCreamStand(Restaruant):
"""冰淇淋小店独特之处"""
def __init__(self,restaurant_name, cuisine_type,*flavors):
"""先初始化父类的属性,再初始化冰淇淋店特有的属性"""
super().__init__(restaurant_name, cuisine_type)
self.flavors = flavors
def flavors_list(self):
"""展示冰淇淋列表"""
print(self.flavors)
for flavor in self.flavors:
print(flavor)
ice_cream = IceCreamStand("BAXY","Ice Cream",'Vanilla','Strawberry')
ice_cream.flavors_list()
#方法二:用列表做类IceCreamStand的属性,这样方便增删
#此时有默认值的number_served要移到最后
class IceCreamStand(Restaruant):
"""冰淇淋小店独特之处"""
def __init__(self,restaurant_name, cuisine_type,flavors,number_served=200,):
"""先初始化父类的属性,再初始化冰淇淋店特有的属性"""
super().__init__(restaurant_name, cuisine_type)
self.flavors = flavors
def flavors_list(self):
"""展示冰淇淋列表"""
print(self.flavors)
for flavor in self.flavors:
print(flavor)
flavors_1 = ['Vanilla','Strawberry']
ice_cream = IceCreamStand("BAXY","Ice Cream",flavors_1,100)
ice_cream.flavors_list()
'''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, login_attempts,
location="Beijing"):
"""初始化描述用户信息的属性"""
self.first_name = first_name
self.last_name = last_name
self.login_attempts = login_attempts
self.location = location
self.field = 'Data Mining'
def describe_user(self):
"""打印用户信息摘要"""
info = self.first_name + " " + self.last_name + " " + self.location \
+ " " + self.field
return info.title()
def greet_user(self):
"""向用户发出问候"""
print("Hello, " + self.first_name.title() + " " +
self.last_name.title() + "!")
def increment_login_attempts(self):
"""将用户登录次数加1"""
self.login_attempts += 1
def reset_login_attempts(self):
"""将用户登录次数重新设置为0"""
if self.login_attempts != 0:
self.login_attempts = 0
class Admin(User):
"""管理员用户的独特之处"""
def __init__(
self, first_name, last_name, login_attempts,
privileges, location="Beijing"):
"""先初始化父类点的属性,再初始化管理员用户的属性"""
super().__init__(first_name, last_name, login_attempts,
location="Beijing")
self.privileges = privileges
def show_privileges(self):
"""显示管理员的权限"""
for privilege in self.privileges:
print("You " + privilege + ".")
admin_privileges = ["can add post", "can delete post", "can ban user"]
admin = Admin("albert", 'einstein', 0, admin_privileges)
admin.show_privileges()
'''9-8 权限:编写一个名为Privileges 的类,它只有一个属性——privileges,
其中存储了练习9-7 所说的字符串列表。 将方法show_privileges( ) 移到这个类中。
在Admin 类中,将一个Privileges 实例用作其属性。创建一个Admin 实例,
并使用方法show_privileges( ) 来显示其权限。'''
b = ["can add post", "can delete post", "can ban user"]
class Privileges():
"""一次模拟权限的简单尝试"""
def __init__(self):
"""初始化描述权限的属性"""
self.privileges = b
def show_privileges(self):
"""显示管理员的权限"""
for privilege in self.privileges:
print("You " + privilege + ".")
class User():
"""一次模拟用户列表的简单尝试"""
def __init__(self, first_name, last_name, login_attempts,location):
"""初始化描述用户信息的属性"""
self.first_name = first_name
self.last_name = last_name
self.login_attempts = login_attempts
self.location = location
def describe_user(self):
"""打印用户信息摘要"""
info = self.first_name + " " + self.last_name + " " + self.location
return info.title()
def greet_user(self):
"""向用户发出问候"""
print("Hello, " + self.first_name.title() + " " +
self.last_name.title() + "!")
def increment_login_attempts(self):
"""将用户登录次数加1"""
self.login_attempts += 1
def reset_login_attempts(self):
"""将用户登录次数重新设置为0"""
if self.login_attempts != 0:
self.login_attempts = 0
class Admin(User):
"""管理员用户的独特之处"""
def __init__(
self, first_name, last_name, login_attempts,location):
"""先初始化父类点的属性,再初始化管理员用户的属性"""
super().__init__(first_name, last_name, login_attempts,location)
self.privileges = Privileges()
admin = Admin("albert", 'einstein', 0,"Beijing")
admin.privileges.show_privileges()
#也可以这样
#创建一个类Privileges的实例
c = ["can add post", "can delete post"]
new_privileges = Privileges()
new_privileges.privileges = c
admin = Admin("albert", 'einstein', 0,"Beijing")
admin.privileges.show_privileges()
'''9-9 电瓶升级:在本节最后一个electric_car.py版本中,
给Battery类添加一个名为upgrade_battery( ) 的方法。这个方法检查电瓶容量,
如果它不是85,就将它设置为85。创建一辆电瓶容量为默认值的电动汽车,调用方法get_range()
然后对电瓶进行升级,并再次调用get_range()你会看到这辆汽车的续航里程增加了。'''
class Battery():
"""一次模拟电动汽车电瓶的简单尝试"""
def __init__(self, size=70):
"""初始化点评的属性"""
self.size = size
def describe_battery(self):
"""打印一条描述电瓶容量的消息"""
print("This car has a " + str(self.size) + "-kwh battery.")
def get_range(self):
"""打印一条消息,指出电瓶的续航里程"""
if self.size == 70:
range = 240
elif self.size == 85:
range = 270
message = "This car can go approximately " + str(range)
message += " miles on a full charge."
print(message)
def upgrade_battery(self):
"""将电瓶容量设置为85"""
if self.size != 85:
self.size = 85
# Battery()即可以是类Battery的一个实例
# 父类Car
class Car():
"""一次模拟汽车的简单尝试"""
def __init__(self, make, model, tank_capacity, year=2016):
"""初始化描述汽车的属性"""
self.make = make
self.model = model
self.tank_capacity = tank_capacity
self.year = year
self.odometer_reading = 0
def get_descriptive_name(self, mile, mileage):
"""返回整洁的描述信息"""
long_name = str(self.year) + " " + self.make + " " + self.model + " " + \
" " + str(self.odometer_reading) + " " + str(
mile) + " " + str(mileage)
return long_name.title()
def read_odometer(self):
"""打印一条指出汽车里程的消息"""
print("This car has " + str(self.odometer_reading) + " miles on it.")
def update_odometer(self, mile):
"""将汽车里程设置为特定的值,并禁止将里程表回调"""
if mile >= self.odometer_reading:
self.odometer_reading = mile
else:
print("You can't roll bake an odometer!")
def increment_odometer(self, mileage):
"""将里程表增加特定的值"""
self.odometer_reading += mileage
def fill_gas_tank(self):
"""打印关于汽车油箱的一条信息"""
print("This car has a " + str(self.tank_capacity) + "L tank.")
# 子类ElectricCar
# 将一个Battery实例用作ElactricCar类的一个属性
class ElectricCar(Car):
"""电动汽车的独特之处"""
def __init__(self, make, model, tank_capacity, year=2013):
"""先初始化父类的属性,,再初始化电动汽车的特有属性"""
super().__init__(make, model, tank_capacity, year)
self.battery_size = Battery()
# 给子类定义新的方法
def describe_battery(self):
"""打印一条描述电瓶容量的消息"""
print("This car has a " + str(self.battery_size) + "-kwh battery.")
# 重写父类中的方法fill_gas_tank
def fill_gas_tank(self):
"""指出全电动汽车没有油箱"""
print("This cas doesn't need a gsa tank.")
# 创建实例
my_tesla = ElectricCar("tesila", "model-L", 70,2016)
# 调用方法
my_tesla.battery_size.get_range()
my_tesla.battery_size.upgrade_battery()
my_tesla.battery_size.get_range()
class Restaruant():
"""一次模拟餐馆的简单尝试"""
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("The " + self.restaurant_name.title() + " is mainly engaged in " +
self.cuisine_type + ".")
def open_restaurant(self):
"""打印一条消息指出餐馆正在营业"""
print("The restaurant is open now.")
def guests_number(self):
"""打印一条关于接待客人人数的消息"""
print('This restaurant has received ' + str(self.number_served) +
" guests.")
def set_number_served(self, a):
"""将接待过的客人人数设置为特定的值"""
if a >= self.number_served:
self.number_served += a
else:
print("Please try again.")
def increment_number_served(self, b):
"""将餐馆接待过的人数增加特定的值"""
print("I think " + restaruant.restaurant_name.title() +
" can accommodate " + str(b) + " guests today.")
self.number_served += b
'''9-10导入Restaurant类: 将最新的Restaurant 类存储在一个模块中。
在另一个文件中, 导入Restaurant 类, 创建一个Restaurant 实例, 并调用Restaurant的
一个方法, 以确认import语句正确无误。'''
from restaurant import Restaruant
new_restaurant = Restaruant("BAXY","Ice Cream")
new_restaurant.describe_restaurant()
b = ["can add post", "can delete post", "can ban user"]
class Privileges():
"""一次模拟权限的简单尝试"""
def __init__(self):
"""初始化描述权限的属性"""
self.privileges = b
def show_privileges(self):
"""显示管理员的权限"""
for privilege in self.privileges:
print("You " + privilege + ".")
class User():
"""一次模拟用户列表的简单尝试"""
def __init__(self, first_name, last_name, login_attempts,location):
"""初始化描述用户信息的属性"""
self.first_name = first_name
self.last_name = last_name
self.login_attempts = login_attempts
self.location = location
def describe_user(self):
"""打印用户信息摘要"""
info = self.first_name + " " + self.last_name + " " + self.location
return info.title()
def greet_user(self):
"""向用户发出问候"""
print("Hello, " + self.first_name.title() + " " +
self.last_name.title() + "!")
def increment_login_attempts(self):
"""将用户登录次数加1"""
self.login_attempts += 1
def reset_login_attempts(self):
"""将用户登录次数重新设置为0"""
if self.login_attempts != 0:
self.login_attempts = 0
class Admin(User):
"""管理员用户的独特之处"""
def __init__(
self, first_name, last_name, login_attempts,location):
"""先初始化父类点的属性,再初始化管理员用户的属性"""
super().__init__(first_name, last_name, login_attempts,location)
self.privileges = Privileges()
'''9-11 导入Admin类: 为完成练习9-8而做的工作为基础,将User、Privileges和Admin类
存储在一个模块中,再创建一个文件,在其中创建一个Admin 实例
并对其调用方法show_privileges( ),以确认一切都能正确地运行。 '''
from user3 import Admin
admin = Admin("albert", 'einstein', 0,"Beijing")
admin.privileges.show_privileges()
class User():
"""一次模拟用户列表的简单尝试"""
def __init__(self, first_name, last_name, login_attempts,location):
"""初始化描述用户信息的属性"""
self.first_name = first_name
self.last_name = last_name
self.login_attempts = login_attempts
self.location = location
def describe_user(self):
"""打印用户信息摘要"""
info = self.first_name + " " + self.last_name + " " + self.location
return info.title()
def greet_user(self):
"""向用户发出问候"""
print("Hello, " + self.first_name.title() + " " +
self.last_name.title() + "!")
def increment_login_attempts(self):
"""将用户登录次数加1"""
self.login_attempts += 1
def reset_login_attempts(self):
"""将用户登录次数重新设置为0"""
if self.login_attempts != 0:
self.login_attempts = 0
Privileges_Admin.py
from user import User
b = ["can add post", "can delete post", "can ban user"]
class Privileges():
"""一次模拟权限的简单尝试"""
def __init__(self):
"""初始化描述权限的属性"""
self.privileges = b
def show_privileges(self):
"""显示管理员的权限"""
for privilege in self.privileges:
print("You " + privilege + ".")
class Admin(User):
"""管理员用户的独特之处"""
def __init__(
self, first_name, last_name, login_attempts,location):
"""先初始化父类点的属性,再初始化管理员用户的属性"""
super().__init__(first_name, last_name, login_attempts,location)
self.privileges = Privileges()
'''9-12多个模块:将User 类存储在一个模块中,并将Privileges和Admin类存储在另一个模块中。
再创建一个文件,在其中创建一个Admin 实例,并对其调用方法show_privileges(),
以确认一切都依然能够正确地运行。'''
#记得在模块Privileges_Admin.py开头写上:from user import User
from Privileges_Admin import Admin
admin = Admin("albert", 'einstein', 0,"Beijing")
admin.privileges.show_privileges()
'''9-13 使用OrderedDict:在练习6-4中,你使用了一个标准字典来表示词汇表。
请使用OrderedDict类来重写这个程序,并确认输出的顺序与你在字典中添加键—值对的顺序一致。'''
#6.4 词汇表2(使用for遍历)
print('\n')
programming_vocabularies = {
'rstrip':'deleting trailing spaces',
'lstrip':'deleting the opening space',
'append':'adding elements at the end of the list',
'sort':'permanently sorting of lists',
'pop':'deleting the element and then use its value'
}
for vocabulary,meaning in programming_vocabularies.items():
print('The meaning of '+ vocabulary +' is '+ meaning+'.')
#使用OrderedDict类重写程序
from collections import OrderedDict
programming_vocabularies = OrderedDict()
programming_vocabularies[ 'rstrip'] = 'deleting trailing spaces'
programming_vocabularies['sort'] = 'permanently sorting of lists'
programming_vocabularies[ 'lstrip'] = 'deleting the opening space'
programming_vocabularies['append'] = 'adding elements at the end of the list'
programming_vocabularies['pop'] = 'deleting the element and then use its value'
print("\n")
for vocabulary,meaning in programming_vocabularies.items():
print('The meaning of '+ vocabulary +' is '+ meaning+'.')
'''9-14骰子:模块random包含以各种方式生成随机数的函数,其中的randint()返回一个
位于指定范围内的整数。例如,下面的代码返回一个1~6内的整数:
from random import randint
x = randint(1, 6)
print(x)
请创建一个Die类,它包含一个名为sides的属性,该属性的默认值为6。
编写一个名为roll_die( ) 的方法, 它打印位于1和骰子面数之间的随机数。
创建一个6面的骰子,再掷10次。创建一个10面的骰子和一个20面的骰子,并将它们都掷10次。'''
class Die():
"""一次模拟骰子的简单尝试"""
def __init__(self):
"""初始化骰子的属性"""
self.sides = 6
def roll_die(self):
"""打印位于1和骰子面数之间的随机数"""
from random import randint
x = randint(1, self.sides)
print(x)
die_6 = Die()
die_6.roll_die()
die_6.sides = 10
die_6.roll_die()
die_6.sides = 20
die_6.roll_die()
#不要像上面那样,要将import语句写在最前面
from random import randint
class Die():
"""一次模拟骰子的简单尝试"""
def __init__(self):
"""初始化骰子的属性"""
self.sides = 6
def roll_die(self):
"""打印位于1和骰子面数之间的随机数"""
x = randint(1, self.sides)
print(x)
die_6 = Die()
die_6.roll_die()
die_6.sides = 10
die_6.roll_die()
die_6.sides = 20
die_6.roll_die()