为啥属性装饰器显示“对象没有属性”?

Posted

技术标签:

【中文标题】为啥属性装饰器显示“对象没有属性”?【英文标题】:Why does property decorator show "object has no attribute"?为什么属性装饰器显示“对象没有属性”? 【发布时间】:2013-02-27 04:54:56 【问题描述】:

我有以下代码:

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) 显示它也没有属性?

【问题讨论】:

Aside:你的意思可能是.toHtml().toAscii()。注意缺少的括号。 属性仅适用于来自object的Python对象 你是对的@Robᵩ! ...您应该将其作为答案提交,就是这样。 【参考方案1】:

这里的问题是 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 类相同,但我自己的测试表明并非如此。)

【讨论】:

超级!我原本希望得到这个答案,但 Rob 帮助我解决了调用 () 时遇到的其他问题。【参考方案2】:

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

【讨论】:

我不接受这个答案(我们可以这样做吗?),因为 superbatfish 实际上回答了基本问题。谢谢罗伯。 优秀。我很高兴 superbatfish 提供了高质量的答案。

以上是关于为啥属性装饰器显示“对象没有属性”?的主要内容,如果未能解决你的问题,请参考以下文章

SQLAlchemy类型装饰器失败,`对象没有属性'self_group'

装饰器模式:为啥我们需要抽象装饰器? [复制]

为啥我们需要装饰器设计模式中的装饰器?

为啥装饰器有用? [关闭]

Python 装饰器 - 为啥? [复制]

为啥 Django REST API 装饰器会破坏 Django non_atomic_requests 装饰器?