1

属性アクセス構文を介して辞書値にアクセスできるように、dictクラスの派生バリアントを作成しています(したがって、dictionary ['foo']を実行する代わりに、 dictionary.fooを実行できます)。これは、これまでのところ次のとおりです。

class dict(dict): 
    __getattr__ = dict.__getitem__

ただし、私のコードのこのスニペットには問題があります。

eventD = {'rrule_end':None}
. . .
. . .
#(some time later)
print event.rrule_end

これは、辞書作成の{}演算子がオーバーロードされていないためです。dictName = {}構文で、通常の辞書の代わりに派生クラスのインスタンスを作成することは可能ですか?

4

2 に答える 2

0

いいえ、その構文をオーバーロードすることはできませんが、それらは実行できる代替手段です。

通常の辞書を自分の辞書に変換する

my_dict( {'foo':bar, 'foo2':bar2} )

関数にキー引数を受け入れさせる

my_dict( foo='bar', foo2='bar2' )

この辞書用に独自の構文を作成してください。これは python のオーバーロード可能な演算子を悪用しており、少し複雑です。my_dict<'foo' で始まる連鎖反応です。演算子をオーバーロードして、別の my_dict オブジェクトを出力し、プロセスを繰り返します。最終的に最後のオブジェクトに到達するまで、各値の記録を毎回保持します。次に、自分のオブジェクトオブジェクトを計算して吐き出します。

my_dict<'foo'|bar,'foo2'|'bar2'>end

編集:

これを行う理由はわかりませんが、これは問題に対する別の答えになる可能性があります。組み込み関数varsも参照してください。これにより、オブジェクトが持つすべての属性の辞書を取得できます。オブジェクトが変更されると、辞書は自動的に変更されます。

class dict_obj(object):
    def __init__(self, obj):
        self.obj = obj
        self.dict = vars(obj)

    def __getattr__(self, value):
        return self.dict[value]
    __getitem__ = __getattr__

このように使用できます

>>> class test:
    def __init__(self):
        self.value = 5


>>> obj = dict_obj(test())
>>> obj.value
5
>>> obj['value']
5
于 2012-10-19T03:27:42.903 に答える
0

いいえ。dict リテラル構文をオーバーライドすることはできません。(また、リスト リテラル構文、文字列リテラル構文、数値リテラル構文、または任意のリテラル構文をオーバーライドすることもできません。)

クラスのインスタンスを明示的に作成する必要があります。クラスに MyDict のような名前を付けてから実行します

eventD = MyDict({'rrule_end':None})
于 2012-10-19T01:45:04.587 に答える