'''
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()