1

次のコードは、Tkinterモジュールを使用して単純なGUIを作成します。

import Tkinter

root = Tkinter.Tk()

myContainer1 = Tkinter.Frame(root)
myContainer1.pack()

button1 = Tkinter.Button(myContainer1) 
button1["text"]= "Hello, World!"  
button1["background"] = "green"     
button1.pack()                 

root.mainloop()

次に、次のコードを見てください。

button1["text"]= "Hello, World!"

この構文は、辞書キーに値を割り当てるのと同じように見えます。ユーザー定義オブジェクトのこの動作の可能性をどのように定義しますか?次のような例を挙げてください。

class Example(object):
    def __init__(self, length = 1, width= 2):
        self.length = length
        self.width = width

42編集1(kindallとjsbuenoへの応答):次のようにして、割り当てられた値を呼び出そうとしe["alpha"]ています。

print e["alpha"]

あなたのコードに私は追加しました:

def __getitem__(self, key, value):
    if key in self.validkeys:
        getattr(self, key, value)
    else:
        raise KeyError

しかし、私はまだ「例」が添字可能なTypeErrorではないことを取得します。


編集2

def __getitem__(self, key):
    if key in self.validkeys:
        return getattr(self, key)
    else:
        raise KeyError
4

1 に答える 1

5

定義__setitem__(); ここを参照してください。対応する__getitem__()ものもあります。

例として:

class Example(object):
    # define which names can be assigned using [...] syntax
    validkeys = set("alpha beta gamma".split())

    # assign valid names as attributes on our object
    def __setitem__(self, key, value):
        if key in self.validkeys:
            setattr(self, key, value)
        else:
            raise KeyError("Key must be one of %s", ", ".join(self.validkeys))

e = Example()
e["alpha"] = 42
print(e.alpha)   # prints 42

辞書やその他の組み込み型をエミュレートするための完全なドキュメントを確認してください:http: //docs.python.org/reference/datamodel.html

于 2012-04-20T22:36:08.887 に答える