使用class属性访问字典

时间:2009-08-27 03:34:08

标签: python dictionary

现在我正在使用python。关于dict的一个问题.... 假设我有一个词典

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'}

如果打印 - > config ['account_receivable']它将返回其对应的值4

但我希望以这种方式访问​​它 - > config.account_receivable,然后它将返回相应的值

我怎么能实现这个??? 如果有人可以请帮助我

BR // 纳兹穆尔

6 个答案:

答案 0 :(得分:12)

为了这个目的,多年前我发明了简单的Bunch成语;实现Bunch的一种简单方法是:

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

如果config是dict,则无法使用config.account_receivable - 这绝对不可能,因为dict不会拥有该属性,句号。但是,您可以config换行到Bunch

cb = Bunch(config)

然后访问cb.config_account到你心中的内容!

修改:如果您希望Bunch上的属性分配也影响原始dictconfig在这种情况下),所以,例如cb.foo = 23 config['foo'] = 23Bunchclass RwBunch(object): def __init__(self, adict): self.__dict__ = adict 需要略有不同的实现:

Bunch

通常情况下,普通Bunch是首选的,正好是,因为,在实例化之后,dict实例和RwBunch被“引发”完全是解耦 - 对其中任何一个的改变不会影响另一个;通常情况下,这种脱钩是你想要的。

当您执行想要“耦合”效果时,dict是获取它们的方法:使用它,实例上的每个属性设置或删除都会内在地设置或删除项目来自dict,反之亦然,设置或删除{{1}}中的项目将从实例中固有地设置或删除属性。

答案 1 :(得分: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

答案 2 :(得分:3)

答案 3 :(得分: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

答案 4 :(得分: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,一旦设置了值,就无法更改值。

答案 5 :(得分:0)

您可以将dict子类化为从未返回未定义属性的项目:

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