Přistupující slovník s atributem class

hlasů
4

teď jsem pracovat s python. Takže jedna otázka o dict .... Předpokládám, že mám dict, který

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

pokud tisk -> config [ ‚account_receivable‘] vrátí jí odpovídající hodnotu 4

ale chci přistupovat tímto způsobem -> config.account_receivable a pak ji vrátí odpovídající hodnotu

Jak mohu implementovat to ??? pokud někdo může, prosím pomozte mi

BR // nazmul

Položena 27/08/2009 v 04:34
zdroj uživatelem
V jiných jazycích...                            


6 odpovědí

hlasů
12

Za tímto účelem lo dávno, že mnoho let, vynalezl jsem jednoduchý Bunchidiom; jeden jednoduchý způsob, jak realizovat Bunch, je:

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

Pokud configje dict, nelze použít config.account_receivable- to je naprosto nemožné, protože dict nemusí mít tento atribut, období. Nicméně, lze zabalit configdo Bunch:

cb = Bunch(config)

a přístup cb.config_accountk co hrdlo ráčí!

Edit : Pokud chcete přiřazení atribut Na Bunchovlivňuje i originál dict( configv tomto případě), takže například cb.foo = 23bude dělat config['foo'] = 23, budete potřebovat slighly jinou implementaci Bunch:

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

Normálně je prostý Bunchse dává přednost, přesně , protože poté, co instance, v Bunchpřípadě a dictto „základním nátěrem“ z jsou zcela oddělené - změny na jeden z nich nemá vliv na straně druhé; a takové oddělení, nejčastěji je to, co je požadováno.

Když budete dělat chtít účinky „spojky“, pak RwBunchje způsob, jak se dostat: s tím, kterým každý atribut nebo výmaz v instance bude skutečně nastavit nebo odstranit položku z dict, a vice versa, nastavení nebo odstranění položky z dictvůle vnitřně nastavit nebo odstranit atributy z instance.

Odpovězeno 27/08/2009 v 04:42
zdroj uživatelem

hlasů
7

Můžete to udělat s collections.namedtuple:

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

Můžete se dozvědět více o namedtuple zde:

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

Odpovězeno 27/08/2009 v 04:42
zdroj uživatelem

hlasů
3

Podívejte se na Convert Python dict vznést námitky? ,

Odpovězeno 27/08/2009 v 04:37
zdroj uživatelem

hlasů
2

Musíte použít jeden z Python speciálních metod .

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
Odpovězeno 27/08/2009 v 04:40
zdroj uživatelem

hlasů
0

Můžete podtřídy dict vrátit položky ze sebe za nedefinovaných atributy:

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

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

Také možná budete chtít přepsat některé jiné metody, stejně, jako je __setattr__, __delattr__, __str__, __repr__a copy.

Odpovězeno 27/08/2009 v 09:51
zdroj uživatelem

hlasů
0

No, můžete to udělat s partou objektů.

class Config(object):
    pass

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

Samozřejmě můžete rozšířit tuto třídu dělat více pro vás. například definovat __init__, takže si můžete vytvořit s argumenty, a možná nastavení.

Dalo by se možná také použít namedtuple ( Python 2.4 / 2.5 link ). To je datová struktura speciálně navrženy tak, aby držet strukturované záznamy.

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

S namedtuples nemůžete změnit hodnoty, jakmile byly nastaveny.

Odpovězeno 27/08/2009 v 04:36
zdroj uživatelem

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