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设置
。