Python入门到实践课后习题第九章

'''
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('restaurant name is '+self.restaurant_name.title())
print('The restaurant cuisine type is '+self.cuisine_type.title())
def open_restaurant(self):
print('The restaurant is open. ')
restaurant = Restaurant('laoxiangji','chicken soup')
print(restaurant.restaurant_name)
print(restaurant.cuisine_type)
restaurant.describe_restaurant()
restaurant.open_restaurant()

"""
9-2 三家餐馆 :根据你为完成练习 9-1 而编写的类创建三个实例,并对每个实例调用方法 describe_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('restaurant name is '+self.restaurant_name.title())
print('The restaurant cuisine type is '+self.cuisine_type.title())
def open_restaurant(self):
print('The restaurant is open. ')
restaurant_1 = Restaurant('laoxiangji','chicken soup')
restaurant_1.describe_restaurant()
restaurant_2 = Restaurant('xiaolongkan','Broiled lobster')
restaurant_2.describe_restaurant()
restaurant_3 = Restaurant('shudaxia','spicy hot pot ')
restaurant_3.describe_restaurant()
"""
9-3 用户 :创建一个名为 User 的类,其中包含属性 first_name 和 last_name ,
还有用户简介通常会存储的其他几个属性。在类 User 中定义一个名为 describe_user() 的方法,
它打印用户信息摘要;再定义一个名为 greet_user() 的方法,它向用户发出个性化的问候。
"""

class User():
def init(self, first_name, last_name):
self.first_name = first_name
self.last_name = last_name
self.gender = 'male'
self.age = 0

def describe_user(self):
    long_info = self.first_name + ' ' \
                + self.last_name + ' is ' \
                + str(self.age) + ' yesrs old, and he is a ' \
                + self.gender
    print(long_info)

def greet_user(self):
    user_info = self.first_name + ' ' + self.last_name
    print(user_info.title() + ',welcom to access to your personal space.')

user = User('zhang', 'san')
user.age = 20
user.gender = 'femal'
user.describe_user()
user.greet_user()
"""
9-4 就餐人数 :在为完成练习 9-1 而编写的程序中,添加一个名为 number_served 的属性,并将其默认值设置为 0 。
根据这个类创建一个名为 restaurant 的实例;打印有多少人在这家餐馆就餐过,然后修改这个值并再次打印它。
添加一个名为 set_number_served() 的方法,它让你能够设置就餐人数。调用这个方法并向它传递一个值,然后再次打印这个值。
添加一个名为 increment_number_served() 的方法,它让你能够将就餐人数递增。
调用这个方法并向它传递一个这样的值:你认为这家餐馆每天可能接待的就餐人数。
"""
from restaurant import Restaurant
class Restaurant_1(Restaurant):
def init(self,restaurant_name, cuisine_type):
super().init(restaurant_name, cuisine_type)
self.number_served = 0
restaurant = Restaurant_1('laoxiangji','chicken soup')
print(restaurant.number_served)
restaurant.number_served = 26
print(restaurant.number_served)
'''
另一种做法:
from restaurant import Restaurant
restaurant = Restaurant('laoxiangji','chicken soup')
restaurant.number_served = 0
print(restaurant.number_served)
restaurant.number_served = 26
print(restaurant.number_served)
添加属性可以直接修改,但是添加方法则需要继承父类然后再添加方法。
'''

子类继承父类之后直接在子类中添加#

from restaurant import Restaurant
class Restaurant_2(Restaurant):
def init(self,restaurant_name,cuisine_type):
super().init(restaurant_name,cuisine_type)

def set_number_served(self,number_served):
    self.number_served = number_served
    print('The number of diners is '+str(self.number_served))
def increment_number_served(self,number):
    self.number_served += number
def read_number_served(self):
    print('Total number of diners is '+str(self.number_served))

restaueant_2 = Restaurant_2('laoxiangji','chicken soup')
restaueant_2.set_number_served(28)
restaueant_2.increment_number_served(32)
restaueant_2.read_number_served()
'''
另一种做法:将要添加的属性抽象出来当成一个类,然后将这个类作为一个属性赋给子类。
from restaurant import Restaurant
class Restaurant_2(Restaurant):
def init(self,restaurant_name,cuisine_type):
super().init(restaurant_name,cuisine_type)
self.number_served = Restaurant_3()
class Restaurant_3():
def init(self, number_diner=0,limitation=90):
self.number_diner = number_diner
self.limitation = limitation
def set_number_served(self):
print('The largest number of diners is ' + str(self.limitation))
def increment_number_served(self, increment_number):
self.number_diner += increment_number
def read_number_served(self):
print('Total number of diners is ' + str(self.number_diner))
restaueant_2 = Restaurant_2('laoxiangji','chicken soup')
restaueant_2.number_served.set_number_served()
restaueant_2.number_served.increment_number_served(30)
restaueant_2.number_served.read_number_served()
'''
"""
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 。
"""
from user import User
class User_1(User):
def init(self,first_name, last_name):
super().init(first_name, last_name)
self.login_attempts = 0
def increment_login_attempts(self,number):
self.login_attempts += number
def reset_login_attempts(self):
if self.login_attempts != 0:
self.login_attempts = 0

user_1 = User_1('zhang', 'san')
user_1.age = 20
user_1.gender = 'femal'
i=10
while i>0:
user_1.increment_login_attempts(1)
i -= 1
print(user_1.login_attempts)
user_1.reset_login_attempts()
print(user_1.login_attempts)
"""
9-6 冰淇淋小店 :冰淇淋小店是一种特殊的餐馆。编写一个名为 IceCreamStand 的类,
让它继承你为完成练习 9-1 或练习 9-4 而编写的 Restaurant 类。这两个版本的 Restaurant 类都可以,
挑选你更喜欢的那个即可。添加一个名为 flavors 的属性,用于存储一个由各种口味的冰淇淋组成的列表。
编写一个显示这些冰淇淋的方法。创建一个 IceCreamStand 实例,并调用这个方法。
"""
from restaurant import Restaurant
class IceCreamStand(Restaurant):
def init(self,restaurant_name, cuisine_type):
super().init(restaurant_name, cuisine_type)
self.flavors = flavors_info#属性可以存储类,那当然也可以存储列表#
def display_icecream(self):
print(self.flavors)
flavors_info = ['strawberry','chocolate','jackfruit']
icecreamstand = IceCreamStand('laoxiangji','chicken soup')
icecreamstand.flavors = flavors_info
icecreamstand.display_icecream()

"""
9-7 管理员 :管理员是一种特殊的用户。编写一个名为 Admin 的类,让它继承你为完成练习 9-3 或练习 9-5 而编写的 User 类。
添加一个名为 privileges 的属性,用于存储一个由字符串(如 "can add post" 、 "can delete post" 、
"can ban user" 等)组成的列表。编写一个名为 show_privileges() 的方法,
它显示管理员的权限。创建一个 Admin 实例,并调用这个方法。
"""
from user import User
class Admin(User):
def init(self,first_name, last_name):
super().init(first_name, last_name)
self.privileges = string
def show_privileges(self):
print(self.privileges)
string = ["can add post", "can delete post","can ban user"]
admin = Admin('zhang', 'san')
admin.age = 20
admin.gender = 'femal'
admin.show_privileges()
"""
9-8 权限 :编写一个名为 Privileges 的类,它只有一个属性 —— privileges ,
其中存储了练习 9-7 所说的字符串列表。将方法 show_privileges() 移到这个类中。
在 Admin 类中,将一个 Privileges 实例用作其属性。创建一个 Admin 实例,
并使用方法 show_privileges() 来显示其权限。
"""
from user import User

class Admin(User):
def init(self,first_name, last_name):
super().init(first_name, last_name)
self.privileges = Privileges()

class Privileges():
def init(self):
self.limit = string

def show_privileges(self):
    print(self.limit)

string = ["can add post", "can delete post","can ban user"]
admin = Admin('zhang', 'san')
admin.age = 20
admin.gender = 'femal'
permissions = Privileges()
admin.privileges.show_privileges()

'''
class Privileges():
def init(self,limit):
self.limit = limit
调用函数admin.privileges.show_privileges(string)时会出现错误:
missing 1 required positional argument: 'limit'为什么??
因为self是一个指向实例本身的引用,换句话说,如果这个类没有实例化则这个类只有self这一个
形参,没有其他形参。本例中Privileges()类是一个方法的抽像,本身不需要实例化,所以初始化
只有一个self形参无其他形参。或者有其他形参,但是形参为默认值,这样就不需要实例化传递参数:
string = ["can add post", "can delete post","can ban user"]
...
class Privileges():
def init(self,limit=string):
self.limit = limit
'''
"""
9-9 电瓶升级 :在本节最后一个 electric_car.py 版本中,给 Battery 类添加一个名为 upgrade_battery() 的方法。
这个方法检查电瓶容量,如果它不是 85 ,就将它设置为 85 。创建一辆电瓶容量为默认值的电动汽车,
调用方法 get_range() ,然后对电瓶进行升级,并再次调用 get_range() 。
你会看到这辆汽车的续航里程增加了。
"""
from car import Car
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_rang(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()

electriccar = ElectricCar('tesla','model s','2016')
electriccar.battery.get_rang()
electriccar.battery.upgrade_battery()
electriccar.battery.get_rang()
"""
9-10 导入 Restaurant 类 :将最新的 Restaurant 类存储在一个模块中。在另一个文件中,
导入 Restaurant 类,创建一个 Restaurant 实例,并调用 Restaurant 的一个方法,
以确认 import 语句正确无误。
"""
from restaurant import Restaurant
restaurant = Restaurant('laoxiangji','chicken soup')
restaurant.describe_restaurant()
"""
9-11 导入 Admin 类 :以为完成练习 9-8 而做的工作为基础,将 User 、 Privileges 和 Admin
类存储在一个模块中,再创建一个文件,在其中创建一个 Admin 实例
并对其调用方法 show_privileges() ,以确认一切都能正确地运行。
"""
from admin import *
admin = Admin('zhang', 'san')
admin.age = 20
admin.gender = 'femal'
admin.privileges.show_privileges()

"""
9-12 多个模块 :将 User 类存储在一个模块中,并将 Privileges 和 Admin 类存储在另一个模块中。
再创建一个文件,在其中创建一个 Admin 实例,并对其调用方法 show_privileges() ,
以确认一切都依然能够正确地运行。
"""
from user import User
from admin import Admin,Privileges
admin = Admin('zhang', 'san')
admin.age = 20
admin.gender = 'femal'
admin.privileges.show_privileges()

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345

推荐阅读更多精彩内容

  • 9.类 基本概念———初探类与对象 “什么是人类”、“什么是狗”、“汽车又是什么”……面对这些问题,我们大多数人会...
    TianAff阅读 624评论 1 5
  • '''定义类:类中的函数称为方法。函数的一切都适合方法,不同的是调用方法的方式。可通过实例访问的变量称为 属性se...
    水中小船阅读 599评论 0 0
  • 8月22日-----字符串相关 2-3 个性化消息: 将用户的姓名存到一个变量中,并向该用户显示一条消息。显示的消...
    future_d180阅读 959评论 0 1
  • rljs by sennchi Timeline of History Part One The Cognitiv...
    sennchi阅读 7,294评论 0 10
  • #!/usr/bin/python3 import _thread import time ##class Dog...
    半场_64dd阅读 575评论 0 0