5

モジュールの動作を模倣してConfigParser、使用する特定のアプリケーションの構成ファイル内の明確に定義された構造を活用する、高度に専門化されたパーサーを作成しています。ファイルは、標準の INI 構造に従います。

[SectionA]
key1=value1
key2=value2

[SectionB]
key3=value3
key4=value4

私のアプリケーションでは、セクションはほとんど関係ありません。異なるセクションのキー間に重複はなく、すべてのユーザーはキー名のみを覚えており、どのセクションに入る必要があるかは決して覚えていません。そのため、オーバーライド__getattr____setattr__て、MyParser作成しているクラスでショートカットを許可したいと思いますこのような:

config = MyParser('myfile.cfg')
config.key2 = 'foo'

この__setattr__メソッドは、最初に呼び出されたセクションを見つけようとし、key2存在する場合はそれを「foo」に設定します。そのようなセクションがないと仮定すると、各セクション内で というキーが検索されますkey2。キーが存在する場合は、新しい値に設定されます。存在しない場合、パーサーは最終的に. を発生させAttributeErrorます。

これのテスト実装を作成しましたが、問題は、この動作から除外されたいくつかのストレートアップ属性も必要であることです。config.filename元のファイルの名前を含む単純な文字列にconfig.contentなり、各セクションの辞書を保持する辞書になりたいです。

カスタムゲッターとセッターによって見過ごされないように、コンストラクターで属性filenameと属性を設定するクリーンな方法はありますか? custom を呼び出す前contentに、python はオブジェクトの属性を探しますか?__dict____setattr__

4

2 に答える 2

7

filenamecontentそれを処理するためにスーパークラスに渡します

class MyParser(object):
    def __setattr__(self, k, v):
        if k in ['filename', 'content']:
            super(MyParser, self).__setattr__(k, v)
        else:
                # mydict.update(mynewattr) # dict handles other attrs
于 2013-01-10T18:00:39.933 に答える
2

ファイルの内容に対して辞書のようなインターフェイスを提示し、属性へのアクセスは内部的な目的のために残した方がすっきりすると思います。しかし、それは私の意見です。

あなたの質問に答えるために、__setattr__()チェックインする前に呼び出される__dict__ので、次のように実装できます。

class MyParser(object):

    specials = ("filename", "content")

    def __setattr__(self, attr, value):
        if attr in MyParser.specials:
            self.__dict__[attr] = value
        else:
            # Implement your special behaviour here
于 2013-01-10T18:01:24.190 に答える