class Foo: def __init__(self, rate=0.3): self.rate = rate self.a = 0 self.b = 0 def get(self): return (self.a, self.b) def add(self, v): if v <= 100: self.a += v elif v <= 200: self.b += v else: t = int(v * self.rate) self.a += t self.b += v - t return self.get() class Empty: pass def gval(v=None): keep = [ v ] def set(v): keep[0] = v e = Empty() e.get = lambda: keep[0] e.set = set return e def foo_new(rate=0.3): p = Empty() p.a = 0 p.b = 0 e = Empty() e.get = lambda: (p.a, p.b) def add(v): if v <= 100: p.a += v elif v <= 200: p.b += v else: t = int(v * rate) p.a += t p.b += v - t return e.get() e.add = add return e def cls_to_dic(c): ks = filter( lambda k: not k.startswith('_'), dir(c) ) return dict( map( lambda k: ( k, getattr(c, k) ), ks ) ) def dic_to_cls(d, c=None): if not c: c = Empty() map( lambda (k, v): setattr(c, k, v), d.items() ) return c def extends(pcls, c=None): if not c: c = Empty() dic_to_cls( cls_to_dic(pcls), c ) return c def bar_new(rate=0.3): foo = foo_new(rate) e = extends(foo) e.vs = [402, 229, 338, 48, 80, 448] def show(): print e.get() e.show = show return e def hoge_new(rate=0.3): bar = bar_new(rate) e = extends(bar) def get(name=None): (a, b) = r = bar.get() return a if name == 'a' else b if name == 'b' else r e.get = get return e