2013-03-11 11 views
5

Mam następujący kod:Dlaczego dekorator właściwości pokazuje "obiekt nie ma atrybutu"?

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 

daje to wyjście wyjątek:

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

Jeśli usunąć @property dekorator lub usunąć połączenie .toAscii, to działa. Ale dlaczego błąd mówi, że nie ma żadnego atrybutu, nawet jeśli jest to pokazane na dir(page)?

+0

* Poza: * Prawdopodobnie miałeś na myśli '.toHtml(). ToAscii()'. Zwróć uwagę na brakujący nawias. –

+0

Właściwość jest dostępna tylko dla obiektów Pythona, które pochodzą z 'obiektu' – dawg

+0

Masz rację @ Robᵩ! ... powinieneś to przedstawić jako odpowiedź, to wszystko. –

Odpowiedz

5

Problem polega na tym, że Python podał komunikat o błędzie , wprowadzając w błąd. Komunikat o błędzie można by oczekiwać w tym przypadku jest to:

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

Ale zamiast, Python dał błędny komunikat o błędzie:

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

Oznacza to, że AttributeError generowane ciągu funkcja nieruchomość została przedstawiona tak jakby to była AttributeError dla samej nieruchomości.

To dziwne zachowanie występuje, gdy klasa z Twoim @property pochodzi z QObject. Jest to znany problem w PyQt. W rzeczywistości opiekunowie PyQt twierdzą, że jest to oczekiwane zachowanie (niesłusznie, IMHO). Aby uzyskać szczegółowe informacje, patrz this thread. (W tym wątku twierdzi się, że QObject zachowuje się identycznie z wbudowaną klasą Pythona object, ale moje własne testy wskazują inaczej.)

+0

Super! Miałem nadzieję uzyskać tę odpowiedź pierwotnie, ale Rob pomógł mi uzyskać inne problemy, które miałem z wywoływaniem(). –

1

Prawdopodobnie miałeś na myśli .toHtml().toAscii(). Zwróć uwagę na brakujący nawias.

+0

Nie zaakceptowałem tej odpowiedzi (czy możemy to zrobić?), Ponieważ superbatfish rzeczywiście odpowiedział na podstawowe pytanie. Dzięki Rob. –

+2

Doskonały. Cieszę się, że superbatfish dostarczył wysokiej jakości odpowiedź. –

Powiązane problemy