もっと明確に言えば、私は本格的なPython
dict
が欲しいと思っていましたが、それはオブジェクトの属性としてその値にアクセスできるようにするためだけです。 個人的には
a["name"]
代わりに
a.name
を書く
a.name
がずっといいです:
>>> a。 id = 42
>>> a。 name = "Jon"
>>> 印刷
{ 'id' : 42 、 'name' : 'Jon' }
この場合、もちろん、標準の辞書機能を維持することが重要です。
>>> print "id:%(id)d、name:%(name)s" % a
id : 42 、名前:ジョン
>>> a。 キー ( )
[ 'id' 、 'name' ]
いいね では、Python自体でそれを行わないのはなぜですか?
実装1.額に。
最初に頭に浮かぶのは、必要なすべての魔法のメソッドの作業を実装することです。
クラス Dict ( dict ) :
def __getattr__ ( self 、key ) :
自己を 返す [キー]
def __setattr__ ( self 、key、value ) :
自己 [キー] =値
def __delattr__ ( self 、key ) :
del self [ key ]
しかし、それはあまりにもPythonicではないようです。 少し詳しく見ると、余分な作業が行われていることがわかり、コードを削減できます。
実装2. Pythonのタオ。
実際、同じシグネチャを持つため、バインドされていないメソッドを他のメソッドに置き換えるだけで十分です。
クラス Dict ( dict ) :
__getattr__ = dict 。 __getitem__
__setattr__ = dict 。 __setitem__
__delattr__ = dict 。 __delitem__
それは確かに良く見えますが、とにかく不器用で拡張性がありません。 この考えで夜寝ていたのに、朝になって、おそらく最もエレガントな解決策になりました。
実装3.小さな魔法。
クラス Dict ( dict ) :
def __new__ ( cls、 * args、 ** kwargs ) :
self = dict 。 __new__ ( cls、 * args、 ** kwargs )
自己 。 __dict__ = self
戻ります
何が起こっているのか理解していますか? 最も興味深いのは、
self.__dict__ = self
という行です。 実際、私たちのオブジェクトは普通の辞書ですが、なぜ自分の属性の辞書でもないのですか? これで、Dictクラスのインスタンスの属性を取得、変更、または削除すると、これらの変更は、辞書としてのこのインスタンスの値に直接影響します。本質的に、これらは同じエンティティになっているためです。
>>> d = Dict ( a = 1 、b = 2 、c = 3 )
>>> 印刷 d
{ 'a' : 1 、 'c' : 3 、 'b' : 2 }
>>> 印刷 d。 a == d [ "a" ]
本当
>>> d。 b = 7
>>> del d。 c
>>> d。 x = 4
>>> 印刷 d
{ 'a' : 1 、 'x' : 4 、 'b' : 7 }
>>> 印刷 d。 キー ( ) 、d。 アイテム ( )
[ 'a' 、 'x' 、 'b' ] [ 1、4、7 ]
それで、Pythonを使って多くの便利で面白いことができるということのもう1つの証拠を得ました。 そして、それがどのように内部に配置されているかを理解すれば、美しくエレガントに行うこともできます。
もちろん、根本的に新しいものは何も作成しませんでしたが、ハーフタイプのエンティティを操作する必要があるプロジェクトでは、辞書とオブジェクトを選択する必要がなくなり、コードが少しきれいになりました。
これがなぜ悪いのか、問題をよりエレガントに解決する方法についてのコメントは歓迎します。