2012-07-06 19 views
9

Trong khi cố gắng bọc các vật thể tùy ý, tôi gặp phải vấn đề với từ điển và danh sách. Điều tra, tôi đã tìm ra một đoạn mã đơn giản có hành vi mà tôi đơn giản không hiểu. Tôi hy vọng một số bạn có thể cho tôi biết những gì đang xảy ra:Tại sao __getattribute__ không được gọi trên một lời gọi __getitem __- tiềm ẩn?

>>> class Cl(object): # simple class that prints (and suppresses) each attribute lookup 
... def __getattribute__(self, name): 
...  print 'Access:', name 
... 
>>> i = Cl() # instance of class 
>>> i.test # test that __getattribute__ override works 
Access: test 
>>> i.__getitem__ # test that it works for special functions, too 
Access: __getitem__ 
>>> i['foo'] # but why doesn't this work? 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: 'Cl' object has no attribute '__getitem__' 

Trả lời

12

kỳ diệu __methods__() được đối xử đặc biệt: Họ đang trong nội bộ giao cho "khe" trong cấu trúc kiểu dữ liệu để tăng tốc độ của họ nhìn lên, và họ là chỉ nhìn lên những khe này. Nếu vị trí trống, bạn nhận được thông báo lỗi bạn nhận được.

Xem Special method lookup for new-style classes trong tài liệu để biết thêm chi tiết. Trích:

Ngoài việc bỏ qua bất kỳ thuộc tính cá thể nào có liên quan đến tính chính xác, tra cứu phương pháp đặc biệt ngầm cũng thường bỏ qua phương thức __getattribute__() ngay cả đối tượng siêu di tích của đối tượng.

[...]

Bỏ qua các máy móc __getattribute__() trong thời trang này cung cấp phạm vi đáng kể cho optimisations tốc độ trong phiên dịch, với chi phí của một số linh hoạt trong việc xử lý các phương pháp đặc biệt (phương pháp đặc biệt phải được đặt trên lớp đối tượng chính nó để được người thông dịch nhất quán gọi).