2013-10-09 47 views
1

我有不同類型的字典爲此我要根據實際參數的 如名稱添加一個簡單的getter,三個存儲參數讓說Python:從字符串動態生成方法?

self.storage = {'total':100,'used':88,'free':1} 

我現在正在尋找一種方式(如果可能的話?)用一些元編程魔術來動態生成一個函數?

而不是

class spaceObj(object): 
    def getSize(what='total'): 
     return storage[what] 

或硬編碼

@property 
def getSizeTotal(): 
    return storage['total'] 

class spaceObj(object): 
# manipulting the object's index and magic 
@property 
def getSize: 
    return ??? 

使調用mySpaceObj.getSizeFree將dervied - 用只的getSize在對象定義一次,通過操作對象函數列表從它派生的相關函數?

是這樣的可能...?

+0

如何'size'和'總'相關? –

+0

我不確定要理解這個問題,但是您需要'getattr'或'__getitem__' – Paco

+1

您可以這樣做 - 但是您希望從當前的方法中獲得什麼? –

回答

5

雖然肯定可以得到一個類的屬性未知屬性,這不是一個Python的方法(__getattr__魔術方法都比較rubyist)

class spaceObj(object): 
    storage = None 

    def __init__(self): # this is for testing only 
     self.storage = {'total':100,'used':88,'free':1} 

    def __getattr__(self, item): 
     if item[:7] == 'getSize': # check if an undefined attribute starts with this 
      return self.getSize(item[7:]) 

    def getSize(self, what='total'): 
     return self.storage[what.lower()] 

print (spaceObj().getSizeTotal) # 100 
+0

非常感謝!這就是我正在尋找的東西;奇蹟般有效! – THX

+0

@Thomas「雖然當然可以從一個類中獲得一個未知屬性作爲一個屬性,但這不是一種pythonic方法」意思是「雖然你可以製造特殊的語言語法,但其他人都會很難理解它」 。所以「像魅力一樣工作」可能更準確地說「本週對我來說就像是一種魅力」。 – msw

2

你可以把值插入到對象作爲屬性:使用__getattr__

class SpaceObj(object): 
    def __init__(self, **kwargs): 
     self.__dict__.update(kwargs) 

storage = {'total':100,'used':88,'free':1} 
o = SpaceObj(**storage) 
print o.total 

o = SpaceObj(total=100, used=88, free=1) 
print o.total 

或:

class SpaceObj(object): 
    def __init__(self, **kwargs): 
     self.storage = kwargs 

    def __getattr__(self,name): 
     return self.storage[name] 

o = SpaceObj(total=100, used=88, free=1) 
print o.total 

後一種方法需要一些更多的代碼,但它更安全;如果您有一個方法foo並且有人使用SpaceObj(foo=1)創建實例,那麼方法將被第一種方法覆蓋。

-2
>>> import new 
>>> funcstr = "def wat(): print \"wat\";return;" 
>>> funcbin = compile(funcstr,'','exec') 
>>> ns = {} 
>>> exec funcbin in ns 
>>> watfunction = new.function(ns["wat"].func_code,globals(),"wat") 
>>> globals()["wat"]=watfunction 
>>> wat() 
wat 
+2

這有何幫助? (或者甚至與這個問題有相似之處?) –