2014-10-11 37 views
0

下面是示例代码。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, 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 

我怎样才能获得应用程序名称 'S1' 是在功能 'setup_s1' 可用(类似 'S2' &“S3 '分别在setup_s2'&'setup_s3'中),而在调用时不显式传递'appname'。即

s.setup_s1('s1') # Do not prefer this 

但是更新从“无”“应用程序名称”的默认值,以“S1” /“S2” /“S3”的创建属性“setup_s1”的期间/“setup_s2” /“setup_s3”是好。 (我不知道这是否可能)。

+1

为什么你有你'_setup_apps'类方法里面的'_setup'方法? – 2014-10-11 10:35:05

+1

为了将所有代码保存在一个地方,我做到了。你甚至可以在'Settings'类之外放置_setup函数,结果仍然是一样的。 – NEB 2014-10-11 10:39:52

回答

1

您可以使用functools.partial将参数绑定到一个函数:

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)) 
+1

谢谢,那为'appname'做了诀窍。你有没有关于函数名称的任何输入?它仍然是'_setup'。 – NEB 2014-10-11 11:03:31