11

我有以下代码:

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

给出这个异常输出:

stav@maia:$ 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)显示它也没有属性?

4

2 回答 2

12

这里的问题是 Python 给出了误导性的错误消息。在这种情况下,人们期望的错误消息是:

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

但相反,Python 给出了一个误导性的错误消息:

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

也就是说,AttributeError属性函数中生成的 an 就好像它是属性本身的 an 一样。AttributeError

当您的类@property派生自QObject. 这是 PyQt 中的一个已知问题。事实上,PyQt 维护者声称这是预期的行为(错误地,恕我直言)。有关详细信息,请参阅此线程。(在该线程中,据称其QObject行为与 Python 的内置object类相同,但我自己的测试表明并非如此。)

于 2013-10-31T20:33:23.387 回答
1

你可能的意思是.toHtml().toAscii()。注意缺少的括号。

于 2013-03-11T21:00:30.393 回答