2011-01-23 91 views
1

好吧,讓我試着盡我所能解釋這一點。可以說我有一個名爲Foobar的類:Python - 通過模塊屬性(通過字符串名稱)獲得對類實例的訪問

class Foobar(): 
    def __init__(self, foo, bar, choo): 
     self.foo = foo 
     self.bar = bar 
     self.choo = choo 

    def doIt(self): 
     return self.foo + self.bar 

,我想有一組的,我將在我的應用程序中使用Foobar的實例10點的可能性。現在,我的最終用戶不知道或關心foo,bar和choo的價值,但願意選擇我將標註的10種可能性中的一種。

所以我想將他們的選擇存儲在數據庫中(但我只想存儲代表Foobar類的特定實例的標籤)。這樣我就可以抓住我需要的實例。

於是,我就喜歡這樣的模塊中設置了我所有的情況下(讓稱它爲「my_instances.py」)

import Foobar 

label_one = Foobar("eenie", "meenie", "miney") 
label_two = Foobar("teeny", "toony", "tiny") 
... 
label_ten = Foobar("biggie", "boogie", "baggie") 

和方式,一旦我有代表他們選擇的DB串,我可以像這樣抓住該實例(我忽略瞭如何獲取字符串,但是顯示了我如何獲取實例)。

import my_instances 

my_object = getattr(my_instances, 'label_one') 
result = my_object.doIt() 

我得到一個TypeError:unbound方法doIt()必須用Foobar實例作爲第一個參數調用。

所以看來我得到Foobar,但不是一個真正的實例。任何幫助將不勝感激。我相信我已經解釋了我的情況,你看到了我想要做的更簡單的解決方法,請給出建議。

+0

嘗試`從Foobar的進口Foobar` – Elalfer 2011-01-23 03:33:29

+0

我可能會做這種展示的不好,但目前還沒有命名Foobar的模塊,只有一類 – MattoTodd 2011-01-25 14:52:12

回答

1

@ payne的查找表創建10個Foobar實例,然後返回您想要使用的實例;這看起來很浪費。爲什麼不按需求實例化,像這樣?

class Foobar(): 
    def __init__(self, foo, bar, choo): 
     self.foo = foo 
     self.bar = bar 
     self.choo = choo 

    def doIt(self): 
     return self.foo + self.bar 


makeFooLookup = { 
    "first": ("eenie", "meenie", "miney"), 
    "second": ("teeny", "toonie", "tiny"), 
    "third": ("biggie", "baggie", "boogie") 
} 
def makeFoo(label, lookup=makeFooLookup): 
    return Foobar(*lookup[label]) 
1

我無法重現您的錯誤(使用from foobar import Foobar),因此您的代碼中似乎有些東西沒有顯示給我們。但最好不要動態查找。爲什麼不創建一個返回foobars字典的工廠函數?

def get_foobars(x, y, z): 
    foobars = {} 
    foobars["label_one"] = Foobar(x, y, z) 
    foobars["label_two"] = Foobar(z, y, x) 
    ... 

或者,如果你不想要的功能,以創造新的foobars每一次,

foobars = {} 
foobars["label_one"] = Foobar(... 

def get_foobars(): 
    return foobars 

或者,更簡潔,

foobars = {'label_one':Foobar("eenie", "meenie", "miney"), 
      'label_two':Foobar(...), 
      ... } 
4

由於意見建議,你可能在Foobar該類和Foobar模塊之間有名稱衝突。

但是,它可能是更清晰明確地定義一個查找表:

foobars = { 
    'label_one': Foobar("eenie", "meenie", "miney"), 
    'label_two': Foobar("teeny", "toony", "tiny"), 
    ... 
    'label_ten': Foobar("biggie", "boogie", "baggie") 
} 

用法:

result = foobars['label_one'].do_it() 

動態符號查找可以巧妙,但不一定清楚。