2013-03-11 203 views
5

我有以下代碼:爲什麼屬性裝飾器顯示「對象沒有屬性」?

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 

給出了這樣的異常輸出:

[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' 

如果我刪除@property裝飾或我刪除了.toAscii通話,那麼它的工作原理。但爲什麼錯誤說沒有屬性,即使是dir(page)顯示它?

+0

* Aside *:您可能意思是'.toHtml()。toAscii()'。請注意缺少的括號。 – 2013-03-11 20:58:37

+0

屬性僅適用於從「對象」下降的Python對象 – dawg 2013-03-11 20:59:37

+0

你是對的@Robᵩ! ...你應該提交這個答案,就是這樣。 – 2013-03-11 20:59:46

回答

5

這裏的問題是,Python給了誤導錯誤消息。該錯誤消息人會想到在這種情況下是這樣的:

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

而是Python中給了誤導性的錯誤消息:

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

也就是說,產生AttributeError屬性功能已提交就好像它是屬性本身的AttributeError一樣。

當您的@property類從QObject派生時,會出現這種奇怪的行爲。這是PyQt中的一個已知問題。事實上,PyQt維護者聲稱它是預期的行爲(錯誤地,恕我直言)。詳情請參閱this thread。 (在該主題中,聲稱QObject的行爲與Python內置的object類相同,但我自己的測試表明不然)。

+0

超級!我原本希望得到這個答案,但羅伯幫助我解決了我在調用()時遇到的其他問題。 – 2013-10-31 22:07:39

1

你可能指的是.toHtml().toAscii()。請注意缺少的括號。

+0

我不接受這個答案(我們可以這樣做嗎?),因爲超級蝙蝠魚實際上回答了潛在的問題。感謝Rob。 – 2013-10-31 22:08:54

+2

非常好。我很高興superbatfish提供了一個高質量的答案。 – 2013-11-01 03:15:49