2013-03-11 41 views
5

Tôi có đoạn mã sau:Tại sao trình bày trang thuộc tính hiển thị "đối tượng không có thuộc tính"?

import sys 
import platform 
from PyQt4.QtGui import QApplication 
from PyQt4.QtWebKit import QWebPage 

class Render(QWebPage): 
    def __init__(self): 
     self.app = QApplication([]) 
     QWebPage.__init__(self) 

    @property 
    def html(self): 
     return self.mainFrame().toHtml.toAscii() 

page = Render() 
print sys.version, platform.platform() 
print 'html attribute?', [p for p in dir(page) if 'html' in p] 
print page.html 

cho đầu ra ngoại lệ này:

[email protected]:$ python property.py 
2.7.3 (default, Aug 1 2012, 05:14:39) 
[GCC 4.6.3] Linux-3.2.0-38-generic-x86_64-with-Ubuntu-12.04-precise 
html attribute? ['html'] 
Traceback (most recent call last): 
    File "property.py", line 18, in <module> 
    print page.html 
AttributeError: 'Render' object has no attribute 'html' 

Nếu tôi loại bỏ các @property trang trí hoặc tôi loại bỏ các .toAscii cuộc gọi, sau đó nó hoạt động. Nhưng tại sao lỗi nói rằng không có thuộc tính, ngay cả tho dir(page) cho thấy nó?

+0

* Ngoài *: Có thể bạn có nghĩa là '.toHtml(). ToAscii()'. Lưu ý các dấu ngoặc đơn còn thiếu. –

+0

Thuộc tính chỉ khả dụng đối với các đối tượng Python xuất phát từ 'đối tượng' – dawg

+0

Bạn đúng @ Robᵩ! ... bạn nên gửi câu trả lời, đó là nó. –

Trả lời

5

Vấn đề ở đây là Python đã đưa ra thông báo lỗi gây hiểu lầm. Các thông báo lỗi ai dám nghĩ rằng trong trường hợp này là:

AttributeError: 'function' object has no attribute 'toAscii' 

Nhưng thay vào đó, Python đã đưa ra một thông điệp sai lầm lỗi:

AttributeError: 'Render' object has no attribute 'html' 

Đó là, một AttributeError tạo trong chức năng sở hữu được trình bày như thể đó là một số AttributeError cho chính tài sản đó.

Hành vi lạ này xảy ra khi lớp học với @property của bạn bắt nguồn từ QObject. Nó là một vấn đề được biết đến trong PyQt. Trong thực tế, các nhà bảo trì PyQt cho rằng đó là hành vi mong đợi (sai, IMHO). Xem this thread để biết chi tiết. (Trong chủ đề đó, tuyên bố rằng QObject hoạt động giống hệt với lớp được xây dựng trong của Python là object, nhưng thử nghiệm của riêng tôi cho biết cách khác.)

+0

Siêu! Tôi đã hy vọng nhận được câu trả lời này ban đầu, nhưng Rob đã giúp tôi nhận được bởi các vấn đề khác tôi đã có với gọi(). –

1

Bạn có thể có nghĩa là .toHtml().toAscii(). Lưu ý các dấu ngoặc đơn còn thiếu.

+0

Tôi không chấp nhận câu trả lời này (chúng ta có thể làm điều đó không?) Vì superbatfish thực sự đã trả lời câu hỏi cơ bản. Cảm ơn Rob. –

+2

Tuyệt vời. Tôi hài lòng rằng superbatfish cung cấp một câu trả lời chất lượng cao. –

Các vấn đề liên quan