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

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

猜你喜欢

转载自blog.csdn.net/Leesoar521yt/article/details/81408041