import inspect
def public(name=None):
def _(f):
f._public_name = name or f.__name__
return f
return _
class abc():
def __init__(self):
self.a = 1
self.b = 2
self.method_map = {}
@public("func1")
def funa(self):
print "funca"
@public("func2")
def funb(self):
print "funb"
def register_public_methods(self):
for name, f in inspect.getmembers(self, lambda f: callable(f) and hasattr(f, "_public_name")):
print f
self.add_method(f, f._public_name)
def add_method(self, fun, name):
self.method_map[name] = fun
if __name__ == "__main__":
a = abc()
a.register_public_methods()
m = a.method_map["func1"]
m()
m = a.method_map["func2"]
m()
结果:
<bound method abc.funa of <__main__.abc instance at 0x7fa53fef6c68>>
<bound method abc.funb of <__main__.abc instance at 0x7fa53fef6c68>>
funca
funb