2013-02-04 70 views
0

我有类:如何在Python中获取调用方法的名称(动态添加)?

class SimpleClass: 
    def __init__(self): 
     pass 

    def init_levels(self): 
     levels = get_levels_list() 
     for level in levels: 
      Transplant(foo, Simplelog, method_name=level) 

移植是动态的添加方法类的类:

class Transplant: 
    def __init__(self, method, host, method_name=None): 
     self.host = host 
     self.method = method 
     self.method_name = method_name 
     setattr(host, method_name or method.__name__, self) 

    def __call__(self, *args, **kwargs): 
     nargs = [self.host] 
     nargs.extend(args) 
     return apply(self.method, nargs, kwargs) 

富是 “移植” 功能:

def foo(self): 
    return 

我怎样才能在foo里面调用方法名称?

比如我执行:

simpleinst = SimpleClass() 
simpleinst.init_levels() 

如何修改我的代码为FOO定义体越来越被调用的方法的名字吗?

回答

2

你必须明确传递:

class Transplant: 
    def __init__(self, method, host, method_name=None): 
     self.host = host 
     self.method = method 
     self.method_name = method_name or method.__name__ 
     setattr(host, method_name or method.__name__, self) 

    def __call__(self, *args, **kwargs): 
     nargs = [self.host, self.method_name] 
     nargs.extend(args) 
     return apply(self.method, nargs, kwargs) 

并延长foo接受这个参数。

+0

谢谢!我只是将nargs = [self.host]替换为nargs = [self],现在我拥有所有的方法参数。 – SkyFox

+0

更好。 :-) –

0

你可以用一个函数工厂做,make_foo

的关键步骤是重新定义函数的func_name属性:

foo.func_name = name 

class SimpleClass: 
    def init_levels(self): 
     levels = ['foo', 'bar'] 
     for level in levels: 
      # Your original code defined this on `SimpleLog`. Did you mean `SimpleClass`? 
      setattr(SimpleClass, level, make_foo(level)) 

def make_foo(name): 
    def foo(self): 
     print('{n} has been called'.format(n = foo.func_name)) 

    foo.func_name = name 
    return foo 

simpleinst = SimpleClass() 
simpleinst.init_levels() 
simpleinst.foo() 
# foo has been called 
simpleinst.bar() 
# bar has been called 
相关问题