前投稿

デコレーターなんてむずかしいことしないで始めから contextmanager をつかっていればよかったんだ……
yo.py
from contextlib import contextmanager
import random
class Prot:
    def __init__(self):
        pass
    @contextmanager
    def yoyo(self, hey):
        print('gacha.') #  __enter__
        yield hey # as
        print('Everything Done Right.') #  __exit__
    def yo_gacha(self, y):
        yo = [y*i for i in range(10)] 
        return yo[random.randint(0, 9)]    
if __name__ == '__main__':
    p = Prot()
    with p.yoyo('hey') as y:
        print(p.yo_gacha(y))
contextlib.contextmanager は with をイイ感じに適用してくれるデコレーターで yield をはさんで __enter__ と __exit__ にわけてくれます  
インデントがひとつ犠牲になるけど記述も楽だしとてもわかりやすい
yield で渡すと as で受け取れるのも理解しやすいかんじ
いろいろラップしたいときはデコレーターを使ったほうがイイかもですが 勉強になりました