2009-08-27 86 views
4

現在我正在使用python。所以,關於字典.... 一個問題,假設我有一個字典是使用類屬性獲取字典

config = {'account_receivable': '4', 'account_payable': '5', 'account_cogs': '8', 'accoun 
t_retained_earning': '9', 'account_income': '6', 'account_expense': '31', 'durat 
ion': 2, 'financial_year_month': 9, 'financial_year_day': 15, 'account_cash': '3 
', 'account_inventory': '2', 'account_accumulated_depriciation': '34', 'account_ 
depriciation_expense': '35', 'account_salary_expense': '30', 'account_payroll_pa 
yable': '68', 'account_discount': '36', 'financial_year_close': '2008-08-08'} 

如果打印 - >配置[「account_receivable」]會返回其對應的值4

,但我想通過這種方式訪問​​它 - > config.account_receivable然後它會返回相應的值

我該如何實現這個? 如果任何一個可以請幫我

BR // 納茲穆爾

回答

12

爲此,羅很多年前,我發明了簡單的Bunch成語;實施Bunch一個簡單的方法是:

class Bunch(object): 
    def __init__(self, adict): 
    self.__dict__.update(adict) 

如果config是一個字典,你不能使用config.account_receivable - 這是絕對不可能的,因爲字典不該屬性,期。但是,您可以包裝config一個Bunch

cb = Bunch(config) 

,然後訪問cb.config_account你的心臟的內容!

編輯:如果你想在Bunch屬性分配也影響原有dict(在這種情況下config),使如cb.foo = 23會做config['foo'] = 23,你需要一個性能稍微不同的實施Bunch

class RwBunch(object): 
    def __init__(self, adict): 
    self.__dict__ = adict 

通常情況下,普通Bunch是首選,正是因爲,實例化後,Bunch實例和dict這是「引」的是完全解耦 - 對其中任何一個的改變都不會影響另一個;而這種脫鉤通常是所期望的。

當你想「耦合」效應,那麼RwBunch是讓他們的方式:有了它,每個屬性設置或刪除的實例將固有設置或從dict刪除的項目,和,反之亦然,設置或刪除dict中的項目將固有地設置或刪除實例中的屬性。

0

嗯,你可以帶着一幫對象做到這一點。

class Config(object): 
    pass 

config = Config() 
config.account_receivable = 4 
print config.account_receivable 

顯然你可以擴展這個類來爲你做更多的事情。例如定義__init__,以便您可以使用參數創建它,也可以使用默認值。

您也可以使用namedtuplepython 2.4/2.5 link)。這是專門用於保存結構化記錄的數據結構。

from collections import namedtuple 
Config = namedtuple('Config', 'account_receivable account_payable') # etc -- list all the fields 
c = Config(account_receivable='4', account_payable='5') 
print c.account_receivable 

使用namedtuples,您無法在設置值後更改值。

2

您需要使用Python的special methods之一。

class config(object): 
    def __init__(self, data): 
     self.data = data 
    def __getattr__(self, name): 
     return self.data[name] 


c = config(data_dict) 
print c.account_discount 
-> 36 
+0

非常感謝 – 2009-08-27 03:51:30

7

你可以用collections.namedtuple做到這一點:

from collections import namedtuple 
config_object = namedtuple('ConfigClass', config.keys())(*config.values()) 
print config_object.account_receivable 

您可以瞭解更多關於namedtuple這裏:

http://docs.python.org/dev/library/collections.html

0

你也可以繼承字典從自身退換貨品未定義的屬性:

class AttrAccessibleDict(dict): 
    def __getattr__(self, key): 
     try: 
      return self[key] 
     except KeyError:  
      return AttributeError(key) 

config = AttrAccessibleDict(config) 
print(config.account_receivable) 

您還可能要重寫一些其他的方法爲好,如__setattr____delattr____str____repr__copy