这可能是一个非常简单的问题,但我对我现在所处的位置感到非常困惑.这是一个非常基础的课程:
class Book(object):
def __init__(self, title, price):
self.book = {'title':title, 'price':price}
Run Code Online (Sandbox Code Playgroud)
当我运行这个:
book = Book('foo', 300)
book['price']
Run Code Online (Sandbox Code Playgroud)
吐出来的:
TypeError: 'Book' object has no attribute '__getitem__'
Run Code Online (Sandbox Code Playgroud)
我知道这不是初始化实例的常规方法,因为我使用字典.但我想知道为什么那段代码吐出了一个TypeError.我该如何解决这个问题?先感谢您.
PS.书籍实例的类型是类?
Hen*_*son 14
这是因为一个类不是一个dict对象.通过点运算符访问类实例上的属性.
book.book['price']
>> 300
Run Code Online (Sandbox Code Playgroud)
如果要直接在类实例上访问dict中的键,则必须在类上实现该__getitem__方法.
def __getitem__(self, key):
return self.book[key]
book['price']
>> 300
Run Code Online (Sandbox Code Playgroud)
是.book是Book类的一个对象,因为你用这种方式初始化它.
book = Book('foo', 300)
book['price']
Run Code Online (Sandbox Code Playgroud)
尝试
print book.book['price']
因此,您希望访问一个名为book的字典,该字典被引用为book,您希望从字典中提取price的值.
通常[]运算符查找__getitem__()方法并将请求的密钥作为参数传递.ŁukaszR.已经证明了如何做到这一点.字典在查找切片或索引时执行键查找.
这里将详细解释: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
Run Code Online (Sandbox Code Playgroud)