2014-10-11 68 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