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

如何在Python中获取被调用方法(动态添加)的名称?,python,oop,methods,Python,Oop,Methods,我有课: 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:

我有课:

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)
Foo是一个用于“移植”的函数:

如何在foo中调用方法名

例如,我执行:

simpleinst = SimpleClass()
simpleinst.init_levels()
如何修改我的代码,以便在foo定义体中调用方法名?

您看过了吗

你看过吗


您可以使用函数工厂,
make\u foo

关键步骤是重新定义函数的
func\u name
属性:

foo.func_name = name


您可以使用函数工厂,
make\u foo

关键步骤是重新定义函数的
func\u name
属性:

foo.func_name = name


您必须显式地传递它:

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
以接受它作为参数。

您必须显式地传递它:

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
以接受它作为参数。

谢谢!我只是将nargs=[self.host]替换为nargs=[self],现在我有了所有的方法参数。谢谢!我只是将nargs=[self.host]替换为nargs=[self],现在我有了所有的方法参数。
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)