2009-08-27 12 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'} 

かの印刷 - >コンフィグそれは4

は、しかし、私がしたいこと、それに対応する値を返します[「account_receivable」]そのようにしてアクセス - > config.account_receivableそれは対応する値を返します

私はこれを実装する方法???いずれかが私に// nazmul

答えて

12

、LOその何年も前に私は単純なBunchイディオムを発明しました。 Bunchを実装する1つの簡単な方法は次のとおりです。

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

configが辞書であれば、あなたはconfig.account_receivableを使用することはできません - dictのは属性、期間を持っていないので、それは、絶対に不可能です。ただし、Bunchconfigをラップすることができますあなたの心のコンテンツへ

cb = Bunch(config) 

してからアクセスcb.config_accountを!

編集:あなたもオリジナルのdict(この場合はconfig)に影響を与えるためにBunch属性の割り当てをしたい場合、その例はそうcb.foo = 23config['foo'] = 23を行います、あなたはBunchのslighly異なる実装が必要になります。

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

通常、無地Bunchが正確ので、インスタンス化した後、Bunchインスタンスとdictがそれであるから、「準備」だった、好ましいです完全に切り離されている - どちらかの変更が他のものに影響することはありません。そのようなデカップリングは、ほとんどの場合、望ましいものです。

あなたが、「カップリング」効果をしたいですかその後、RwBunchがそれらを取得する方法である:それで、インスタンス上で設定または削除すべての属性は、本質的に設定されますかdictから項目を削除し、そして、その逆dictからアイテムを設定または削除すると、インスタンスから属性が本質的に設定または削除されます。

0

まあ

BRを助けてくださいことができる場合 、あなたは、オブジェクトの束とそれを行うことができます。

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 

名前付きタプルを使用すると、名前付きタプルを設定すると値を変更できなくなります。

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

ありがとう –

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として、同様に他のいくつかのメソッドをオーバーライドする場合があります。

関連する問題