练习03

# 创建装饰器, 要求如下:
# 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值