Accesing dicionário com atributo de classe

votos
4

Agora eu estou trabalhando com python. Então, uma pergunta sobre dict .... Suponha que eu tenho um dicionário que

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

se a impressão -> config [ 'account_receivable'] ele irá retornar o seu valor correspondente que 4

mas eu quero acessá-lo por esse caminho -> config.account_receivable e, em seguida, ele vai devolvê-lo valor correspondente

Como posso implementar este ??? se alguém pode me ajudar por favor

BR // Nazmul

Publicado 27/08/2009 em 04:34
fonte usuário
Em outras línguas...                            


6 respostas

votos
12

Para o efeito, eis que há muitos anos, eu inventei o simples Bunchexpressão; Uma maneira simples de implementar Bunché:

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

Se configé um dicionário, você não pode usar config.account_receivable- isso é absolutamente impossível, porque um dicionário não tem esse atributo, período. No entanto, você pode embrulhar configem um Bunch:

cb = Bunch(config)

e, em seguida, acessar cb.config_accounto conteúdo do seu coração!

Editar : se você quiser atribuir atribuição no Bunchque também afetam o original dict( configneste caso), de modo que por exemplo, cb.foo = 23vai fazer config['foo'] = 23, você precisa de uma implementação slighly diferente de Bunch:

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

Normalmente, a planície Bunché o preferido, exatamente porque , depois de instanciação, a Bunchinstância eo dictque era "ferrado" de são totalmente dissociado - alterações em qualquer um deles não afetam a outra; e tal dissociação, na maioria das vezes, é o que é desejado.

Quando você fazer quer efeitos "acoplamento", então RwBunché a maneira de obtê-los: com ele, todos os atributos configuração ou exclusão na instância irá intrinsecamente definir ou excluir o item da dict, e, vice-versa, a criação ou exclusão de itens da dictvontade intrinsecamente definir ou excluir atributos da instância.

Respondeu 27/08/2009 em 04:42
fonte usuário

votos
7

Você pode fazer isso com collections.namedtuple:

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

Você pode aprender mais sobre namedtuple aqui:

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

Respondeu 27/08/2009 em 04:42
fonte usuário

votos
3

Ter um olhar para Convert Python dict de se opor? .

Respondeu 27/08/2009 em 04:37
fonte usuário

votos
2

Você precisa usar um dos do Python métodos especiais .

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
Respondeu 27/08/2009 em 04:40
fonte usuário

votos
0

Você pode subclasse dict para retornar itens de si para atributos indefinidos:

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

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

Você também pode querer substituir alguns outros métodos, bem como, tais como __setattr__, __delattr__, __str__, __repr__e copy.

Respondeu 27/08/2009 em 09:51
fonte usuário

votos
0

Bem, você poderia fazê-lo com um monte de objetos.

class Config(object):
    pass

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

Obviamente, você pode estender esta classe para fazer mais para você. por exemplo, definir __init__para que você possa criá-lo com argumentos, e talvez padrões.

Você poderia também usar um namedtuple ( python 2.4 / 2.5 ligação ). Esta é uma estrutura de dados projetado especificamente para manter registros estruturados.

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

Com namedtuples, você não pode alterar os valores depois de terem sido definida.

Respondeu 27/08/2009 em 04:36
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more