【问题标题】:How do you define dictionary-like value assignment for a user defined object?您如何为用户定义的对象定义类似字典的值分配?
【发布时间】:2012-04-20 22:32:33
【问题描述】:

以下代码使用 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

编辑 1(响应 kindall 和 jsbueno): 我正在尝试通过以下方式调用分配给e["alpha"] 的值42

print e["alpha"]

我添加到你的代码中:

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

但我仍然得到'Example' is not subscriptable TypeError。


编辑 2

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

【问题讨论】:

    标签: python class dictionary


    【解决方案1】:

    定义__setitem__();见here。还有一个对应的__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

    【讨论】:

    • 谢谢!我试图通过键入print e["alpha"] 来调用值42。我通过定义 __getitem__ 来定义这一点。但我仍然得到一个 TypeError。你能检查我编辑过的原始回复吗?
    • __getitem__() 只需要两个参数,而你需要三个参数。我确定这就是问题所在。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-21
    • 1970-01-01
    • 1970-01-01
    • 2020-08-31
    • 2013-01-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多