Re-use a global function within a class decorator
假设我有一个函数,它生成一个路由器函数,根据数字是奇数还是偶数调用指定的回调:
1 2 3 4 5 6 7 | def odd_even_router(odd, even): def r(n): if n % 2: odd(n) else: even(n) return r |
我还有一个类修饰器,它将一个类似的路由器方法(名为
1 2 3 4 5 6 7 8 9 | def attach_default_router(cls): def route(self, n): if n % 2: self.on_odd(n) else: self.on_even(n) cls.check_number = route return cls |
号
然后,用
1 2 3 4 5 6 7 | @attach_default_router class A(object): def on_odd(self, n): print 'Odd number' def on_even(self, n): print 'Even number' |
如果我想重新使用
1 2 3 4 5 6 7 | def attach_default_router(cls): def route(self, n): r = odd_even_router(self.on_odd, self.on_even) r(n) cls.check_number = route return cls |
。
然而,一个不良的影响是,每次调用
本质上的问题是:
我如何解决这个困境?
你可以,但是你必须在运行时绑定你的
这不仅是因为你的
因此,如果要生成一个用于修饰类的所有实例的
1 2 3 4 5 6 7 8 9 10 11 12 | def odd_even_router_method_factory(odd, even): def route(self, n): if n % 2: odd.__get__(self)(n) else: even.__get__(self)(n) return route def attach_default_router(cls): route = odd_even_router_method_factory(cls.on_odd, cls.on_even) cls.check_number = route return cls |
注意,python现在仍然会创建一个