# 创建装饰器, 要求如下:
# 1. 创建add_log装饰器, 被装饰的函数打印日志信息;
# 2. 日志格式为: [字符串时间] 函数名: xxx, 运行时间:xxx, 运行返回值结果:xxx
import time import functools def add_log(fun): @functools.wraps(fun) def wrapper(*args,**kwargs): start_time = time.time() ret = fun(*args,**kwargs) end_time = time.time() print '%s,函数名:%s,注释:%s,运行时间为:%.6f,返回结果:%s' %(time.ctime(),fun.__name__,fun.__doc__, end_time - start_time,str(ret)) return ret return wrapper @add_log def test(): """test注释""" print 'hello' return 1 test()
hello
Thu Sep 6 15:05:52 2018,函数名:test,注释:test注释,运行时间为:0.000015,返回结果:1
# 2. 升级版(有参数的装饰器)
# 编写装饰器required_types, 条件如下:
# 1). 当装饰器为@required_types(int,float)确保函数接收到的每一个参数都是int或者float类型;
# 2). 当装饰器为@required_types(list)确保函数接收到的每一个参数都是list类型;
# 3). 当装饰器为@required_types(str,int)确保函数接收到的每一个参数都是str或者int类型;
# 4). 如果参数不满足条件, 打印 TypeError:参数必须为xxxx类型
def required_types(*kind): def required_ints(fun): @functools.wraps(fun) def wrapper(*args, **kwargs): for i in args: if isinstance(i, kind): pass else: print 'TypeError:参数必须为', kind, '类型' break else: res = fun(*args, **kwargs) return res return wrapper return required_ints @required_types(str) def add(a, b): return a + b def myMax(a, b, c, d): return max(a, b, c, d) print add(3, 4.0)
TypeError:参数必须为 (<type 'str'>,) 类型
None
案例2:摆放家具
需求:
1.房子有户型,总面积和家具名称列表
新房子没有任何的家具
2.家具有名字和占地面积,其中
床:占4平米
衣柜:占2平面
餐桌:占1.5平米
3.将以上三件家具添加到房子中
4.打印房子时,要求输出:户型,总面积,剩余面积,家具名称列表
剩余面积:
1.在创建房子对象的时候,定义一个剩余面积的属性,初始值和总面积相等
2.在调用添加家具的方法时,让 剩余面积 -= 家具的面积
class HouseItem: def __init__(self, name, area): self.name = name self.area = area def __str__(self): return '家具名:%s\t占地面积:%.2f' % (self.name, self.area) bed = HouseItem('bed', 400) print bed chest = HouseItem('chest', 2) print chest table = HouseItem('table', 1.5) print table class House: def __init__(self, house_type, area): self.house_type = house_type self.area = area self.free_area = area self.item_list = [] def __str__(self): return '房型:%s \n面积:%.2f[剩余面积:%.2f]\n家具:%s' % (self.house_type, self.area, self.free_area, self.item_list) def item_add(self, item): if item.area > self.free_area: print '%s 过大,无法放入' % item.name else: print '添加%s 成功' % item.name self.item_list.append(item.name) self.free_area -= item.area home = House('三室一厅', 100) print home home.item_add(bed) home.item_add(chest) home.item_add(table) print home
家具名:bed 占地面积:400.00
家具名:chest 占地面积:2.00
家具名:table 占地面积:1.50
房型:三室一厅
面积:100.00[剩余面积:100.00]
家具:[]
bed 过大,无法放入
添加chest 成功
添加table 成功
房型:三室一厅
面积:100.00[剩余面积:96.50]
家具:['chest', 'table']
演练重点:一个对象的属性可以是另外一个类创建的对象
示例:士兵射击
需求:
1.士兵瑞恩有一把AK47
2.士兵可以开火(士兵开火扣动的是扳机)
3.枪 能够 发射子弹(把子弹发射出去)
4.枪 能够 装填子弹 --增加子弹的数量
Soldier Gun
--------- ------------
name model
gun bullet_count
---------- -------------
__init__(self) __init__(self)
fire(self) add_bullet(self,count)
shoot(self)
class Gun: def __init__(self, model): self.model = model self.bullet_count = 0 def add_bullet(self, count): self.bullet_count += count def shoot(self): if self.bullet_count <= 0: print '%s 没有子弹' % self.model else: self.bullet_count -= 1 print '%s 突突突... 剩余子弹%d' % (self.model, self.bullet_count) class Soldier: def __init__(self, name): self.name = name self.gun = None def fire(self): if self.gun == None: print '%s 没有枪' % self.name else: print 'go!!! %s' % self.name self.gun.add_bullet(50) self.gun.shoot() ak = Gun('ak47') # ak.add_bullet(50) # ak.shoot() ryan = Soldier('ryan') ryan.gun = ak ryan.fire()
go!!! ryan
ak47 突突突... 剩余子弹49
图书管理系统
1. 查询所有书籍
2. 增加书籍
3. 借出书籍
4. 归还书籍
5. 退出
class Book(object): def __init__(self, name, author, state, bookIndex): self.name = name self.author = author self.state = state self.bookIndex = bookIndex def __str__(self): stat = '已借出' if self.state == 1: stat = '未借出' return '书名:%s 作者:%s 状态:%s 位置:%s' % (self.name, self.author, self.state, self.bookIndex) class BookManger(object): books = [] def start(self): self.books.append(Book('1', '1', 1, 1)) self.books.append(Book('2', '2', 1, 2)) def menu(self): self.start() while True: print '图书管理系统'.center(50) print '1.查询所有书籍' print '2.增加书籍' print '3.借出书籍' print '4.归还书籍' print '5.退出' ch = raw_input('请选择:') if ch == '1': self.viewBook() elif ch == '2': self.addBook() elif ch == '3': self.borrowBook() elif ch == '4': self.returnBook() elif ch == '5': return else: pass def addBook(self): name = raw_input('请输入书名:') self.books.append(Book(name, raw_input('作者:'), 1, raw_input('书籍位置:'))) print '添加图书%s成功' % name def borrowBook(self): ch = raw_input('请输入书名:') ret = self.checkBook(ch) if ret != None: if ret.state == 1: print '谢谢借阅%s' % ch ret.state = 0 else: print '%s已被借阅,请借阅其他书籍' % ch else: print '书籍%s不存在' % ch def returnBook(self): name = raw_input('请输入书名:') ret = self.checkBook(name) ret.state = 1 print '归还成功' def checkBook(self, book): for i in self.books: if i.name == book: return i else: return None def viewBook(self): for i in self.books: print i world = BookManger() world.menu()
图书管理系统
1.查询所有书籍
2.增加书籍
3.借出书籍
4.归还书籍
5.退出
请选择:1
书名:1 作者:1 状态:1 位置:1
书名:2 作者:2 状态:1 位置:2