Python 面向对象+yield+装饰器随笔

假设:我想买台饮料贩卖机。

class Machine():       # 卖机器的
    nothing = False

    def put_drink(self):   #  装饮料的功能
        while not self.nothing:
            yield "1瓶"          

my_machine = Machine()      # 我买了一台

嗯,机器就放在楼下吧,现在往里面放满饮料。

ds_drink_machine = my_machine.put_drink()   # downstairs drink machine 楼下的饮料机 

饮料也放完了,坐等收钱。

In [59]: next(ds_drink_machine)   # A买了1瓶
Out[59]: '1瓶'

In [60]: next(ds_drink_machine)   # B买了1瓶
Out[60]: '1瓶'

In [61]: [next(ds_drink_machine) for drink in range(2)]   # C买了2瓶
Out[62]: ['1瓶', '1瓶']
... ...
my_machine.nothing = True    # 没饮料了

N个人买过之后,Y过来买饮料。

In [100]: next(ds_drink_machine)
Out[101]: StopIteration     # 没饮料了
... ...

之后来了M个人,都没饮料。晚上我去看我的机器,我去,啥时候没饮料了,都不吱个声。没办法,再装满吧。

my_machine.nothing = False   
ds_drink_machine = my_machine.put_drink()   # 装满饮料

N个人买完之后,Z来了,正好我在楼下,他告诉我,你可以弄个徽信支付呀,这样你不但知道谁买了多少,而且还知道啥时候卖完。我一想,这是个好办法,弄个去。(添加函数功能)

class Machine():       
    nothing = False

    def hx_pay(self):
        return next(self.put_drink())

    def put_drink(self):
        while not self.nothing:
            yield "1瓶"

ok, 这下好了

In [150]: my_machine.hx_pay()   # F使用徽信买了一瓶
Out[150]: '1瓶'

In [151]: my_machine.hx_pay()   # G使用徽信买了一瓶

Out[151]: '1瓶'

In [152]: my_machine.hx_pay()   # H使用徽信买了一瓶

Out[152]: '1瓶'

等哈, 我怎么没收到谁买了几瓶,看了下徽信介绍,噢,我没开那个功能,我打开下。(加个装饰器

class Machine():       
    nothing = False

    def new_character(func):
        def wrapper(self, name, count, *args, **kwargs):
            print("%s使用徽信支付购买%d瓶饮料" % (name, count))
            for _ in range(count):
                print(func(self))
        return wrapper

    @new_character
    def hx_pay(self):
        return next(self.put_drink())

    def put_drink(self):
        while not self.nothing:
            yield "1瓶"

大功告成,坐享其成。

In [211]: my_machine.hx_pay("小智", 2)   # 小智使用徽信买了2瓶
小智使用徽信支付购买2瓶饮料
11瓶

In [212]: my_machine.hx_pay("小霞", 1)   # 小霞使用徽信买了1瓶
小霞使用徽信支付购买1瓶饮料
1瓶

In [213]: my_machine.hx_pay("小刚", 3)   # 小刚使用徽信买了3瓶
小刚使用徽信支付购买3瓶饮料
111

这下舒坦很,就知道卖了多少了。

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值