对象没有属性“__getitem__”(类实例?)

8

这可能是一个非常简单的问题,但我现在非常困惑我的方向。以下是一个非常基本的类:

class Book(object):
    def __init__(self, title, price):
        self.book = {'title':title, 'price':price}

当我运行以下代码时:

book = Book('foo', 300)
book['price']

它输出的结果如下:
TypeError: 'Book' object has no attribute '__getitem__'

我知道使用字典不是初始化实例的常规方式,但我想知道为什么该代码会产生 TypeError。我该如何解决这个问题呢? 提前感谢你的帮助。
附:书籍实例的类型是类吗?
4个回答

15

这是因为类不是字典对象。 通过点运算符访问类实例的属性。

book.book['price'] 
>> 300

如果你想要在类实例中直接访问字典中的键,你需要在类中实现__getitem__方法。

def __getitem__(self, key):
    return self.book[key]

book['price']
>> 300

7

是的。 book 是类 Book 的一个对象,因为您以这种方式初始化它。

book = Book('foo', 300)
book['price']

尝试:

print book.book['price']

所以你想访问一个名为book的字典,这个字典是被引用为book的对象的一部分,你想从字典中提取price的值。

通常[]运算符寻找__getitem__() 方法并将请求的键作为参数传递。 Łukasz R.已经展示了如何实现这一点。字典执行关键查找,而数组则查找切片或索引。

这里详细解释了这一点:https://docs.python.org/2/reference/datamodel.html

现在因为你正在创建一个类,所以为什么要为类的本地必须有的属性创建一个单独的字典呢?可以像下面的例子一样创建属性:

class Book(object):
    def __init__(self, title, price):
        self.title = 'foo'
        self.price = 300

book = Book('foo', 300)
print book.title

3

book.book['price'] 将起作用。 要访问代理成员,您需要实现 __getitem__ 魔法方法。

class Book(object):
    def __init__(self, title, price):
        self.book = {'title':title, 'price':price}
    def __getitem__(self, item):
        return self.book[item]

1
class Book(object):
    def __init__(self, title, price):
        self.book = {'title':title, 'price':price}              

book = Book('foo', 300)
print book.book['price']

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接