Python:为动态添加的函数获取适当的属性/函数名

Python:为动态添加的函数获取适当的属性/函数名,python,Python,下面是示例代码 import inspect from types import MethodType class Settings(object): APPS = ['s1', 's2', 's3'] def __init__(self): Settings._setup_apps(self) @classmethod def _setup_apps(cls, instance): def _setup(self, appna

下面是示例代码

import inspect
from types import MethodType
class Settings(object):
    APPS = ['s1', 's2', 's3']
    def __init__(self):
        Settings._setup_apps(self)

    @classmethod
    def _setup_apps(cls, instance):

        def _setup(self, appname = None):
            print "appname : ", appname
            print "inspect : ", inspect.currentframe().f_code.co_name

        for app in Settings.APPS:
            new_attr_name = _setup.__name__[1:] + '_' + app
            setattr(Settings, new_attr_name, _setup)
            # setattr(instance, new_attr_name, MethodType(_setup, instance, type(instance)))
执行

s = Settings()
s.setup_s1()
结果

appname :  None
inspect :  _setup
如何在调用函数“setup_s1”(类似于“setup_s2”和“setup_s3”中的“s2”和“s3”)时使应用程序名“s1”可用,而不显式传递“appname”。i、 e

s.setup_s1('s1') # Do not prefer this
但是在创建属性“setup\u s1”/“setup\u s2”/“setup\u s3”期间,将“appname”的默认值从“None”更新为“s1”/“s2”/“s3”是好的。(我不知道这是否可行)。

您可以使用将参数绑定到函数:

import inspect
import functools

class Settings(object):
    APPS = ['s1', 's2', 's3']
    def __init__(self):
        Settings._setup_apps(self)

    @classmethod
    def _setup_apps(cls, instance):

        def _setup(self, appname = None):
            print "appname : ", appname
            print "inspect : ", inspect.currentframe().f_code.co_name

        for app in Settings.APPS:
            new_attr_name = _setup.__name__[1:] + '_' + app
            setattr(Settings, new_attr_name, functools.partial(_setup, instance, app))

为什么在
\u setup\u apps
类方法中有
\u setup
方法?为了将所有代码保存在一个地方,我这样做了。您甚至可以将
\u setup
函数放置在类
设置
之外,结果仍然是一样的。谢谢,这为
appname
提供了窍门。您对函数名有任何输入吗?它仍然是
\u设置