2015-06-11 27 views
5

Çok basit bir soru olabilir ama şu an nereye gittiğimle çok karıştım.Object '__getitem__' özelliğine sahip değil (sınıf örneği?)

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

Ve çalıştırdığınızda bu: İşte çok temel sınıftır

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

O tükürür:

TypeError: 'Book' object has no attribute '__getitem__' 

Bunun bir örneğini başlatılıyor geleneksel yol değil biliyorum sözlük kullanıyorum çünkü. Ama bu kodun neden bir TypeError tükettiğini merak ediyorum. Bu sorunu çözmek için nasıl giderim? Önceden teşekkür ederiz.

ps. Kitap örneğinin türü sınıf mı?

cevap

11

Çünkü bir sınıf bir dikte nesnesi değildir. Bir sınıfın örneklerine erişim, nokta operatörü üzerinden yapılır. Eğer sınıf örneğinde doğrudan dict içinde anahtarlarını erişmek istiyorsanız

book.book['price'] 
>> 300 

Eğer sınıfına __getitem__ yöntemi uygulamak zorunda kalacak.

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

book['price'] 
>> 300 
5

Evet. book, Book sınıfının bir nesnesi olduğundan, bu şekilde başlatmışsınızdır.

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

Yani kitap kitabında olarak başvurulan bir nesnenin denilen bir sözlük erişmek istiyorsanız ve sözlükten fiyata değerini çıkarmak istediğiniz

print book.book['price']

deneyin .

Genellikle [] işleci __getitem__() yöntemini arar ve istenen anahtarı bağımsız değişken olarak geçirir. Łukasz R. bunu nasıl yapacağını gösterdi. Diziler dilim veya dizin bulurken sözlükler bir anahtar arama gerçekleştirir.

Burada detaylı olarak açıklanmıştır: Artık https://docs.python.org/2/reference/datamodel.html

Burada bir sınıf oluştururken, çünkü, neden yerli için ayrı bir sözlük oluşturmak istiyorsunuz sınıfın niteliklerini Mutlaka sahip olunması gereken. Aşağıdaki örnekte olduğu gibi özellikler oluşturun:

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'] çalışacak. Proxy üyesine erişmek için __getitem__ sihirli yöntemini uygulamanız gerekir.

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'] 
İlgili konular