无法使用装饰器覆盖类对象的 str 结果

2024-01-25

请参阅下面我的回答;发布问题后我意识到发生了什么事。


我尝试使用装饰器覆盖类的字符串表示形式不起作用。我一定错过了一些东西,但不知道它是什么。

from functools import wraps

def str_dec(obj):
    @wraps(obj.__str__)
    def __str__(cls):
        return '<desired result>'
    obj.__str__ = __str__
    return obj

@str_dec
class Test():
    pass

assert Test.__str__(Test) == '<desired result>' # success
assert str(Test) == '<desired result>' # failure

显然是新的Test.__str__方法已成功创建,但我希望它被调用str功能。反而,str正在使用默认的字符串创建方法(例如type对象)。

我可以得到str使用元类工作,但是然后__str__方法不行!无论如何,我更喜欢使用装饰器。

class str_meta(type):
    def __str__(cls):
        return '<desired result>'

class Test(metaclass = str_meta):
    pass

assert str(Test) == '<desired result>' # success
assert Test.__str__(Test) == '<desired result>' # failure

这里发生了什么?我怎样才能覆盖__str__始终如一地为我的班级?


简而言之,__str__方法影响类的行为实例,不是班级type.

对于您的第一个示例,以下内容确实有效:

assert str(Test()) == '<desired result>'
assert str(Test) == type.__str__(Test)

如果要修改的字符串化是类型,而不是其实例,则您确实需要一个元类,如第二个示例中所示。

我很好奇它的用例是什么。可以看到添加了一个classmethod返回一个str作为命名方法,但会对不响应的类型感到惊讶str() as per repr().

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无法使用装饰器覆盖类对象的 str 结果 的相关文章

随机推荐

  • 从使用 atexit() 注册的函数内部获取退出状态

    在我的里面atexit 注册函数我想获得退出状态 参数exit 3 或者 main 返回了什么 有没有任何便携式方法可以做到这一点 是否有任何 GNU libc 特定的方法可以做到这一点 例如我可以引用的全局持有该值 这是一个技巧 hack
  • 如何将图片上传到另一台服务器?

    我想创建一个提供 html 内容的应用程序服务器 其中包含由不同域上的另一台服务器提供的静态图像的链接 图片由用户通过应用服务器上传 我将执行以下操作将 JPEG 文件上传到应用程序服务器 if file exists folder nam
  • TFS 构建失败,但 Visual Studio 可以工作

    我做了一个新的构建定义 大多数选项保留默认值 我暂时只是玩玩而已 问题是 当我在 Visual Studio 2013 中以发布模式构建项目时 一切都很好 没有错误 当 TFS 构建它时 我遇到了一些错误 我必须将其从我自己的语言翻译成英语
  • 如何在滚动视图中调整图像视图的大小,就像在此图像中完成的那样?

    我创建了一个滚动视图 并在其中放置了一个图像视图 我希望滚动它以与下图中相同的方式调整大小 但到目前为止我还没有取得什么成功 在我的尝试中 图像在滚动时调整了大小 但是调整大小后仍有剩余空间 您将如何修改以下内容 Image 到目前为止我的
  • JS 中的 Excel PMT 函数

    我在互联网上找到了一个关于 PMT 计算的小片段 function PMT i n p return i p Math pow 1 i n 1 Math pow 1 i n function CalculatePMTFromForm idL
  • 如何在多个显示器上最大化窗口?

    使用 AutoHotkey 如何绑定热键以在多个显示器上拉伸 最大化 跨越窗口 以便它覆盖两个显示器 现在 我必须通过用鼠标手动拉伸窗口来完成此操作 我知道有专用工具可以执行此操作 但我已经在运行 AutoHotkey 脚本 并且宁愿限制我
  • SOQL python 中的通配符

    我正在尝试使用 simple salesforce 包使用 python 从 salesforce 进行查询 当我使用通配符时 它会抛出故障错误 soql SELECT FROM Contact where LastModifiedDate
  • Protractor 的 waitForAngular() 在 angular-webapp 上失败(真实设备上的 appium/chrome)

    我 新 使用量角器来运行 e2e 黄瓜测试 我有一个基于 angularJS 的网络应用程序 我正在使用 appium 在真实的 Android 设备上远程运行测试 这是我正在使用的版本 windows8 1 email protected
  • SBT:评估任务顺序

    我正在尝试获取有关 sbt 项目中所有模块的信息 有以下代码 lazy val getModule taskKey Module get single module info lazy val allModules taskKey Seq
  • 在 FilterChain.doFilter() - HttpServletResponseWrapper 之后添加 Cookie 以忽略刷新?

    我想将 cookie 添加到HttpServletResponse其内容 通常是 HTML 呈现后 正如这里提到的 http osdir com ml java jasig uportal 2005 10 msg00276 html htt
  • 基于 SQS 消息触发 SWF 工作流

    前言 我正在尝试针对我认为非常常见的用例提出一个提案 并且我想使用 Amazon 的 SWF 和 SQS 来实现我的目标 可能还有其他服务更符合我想要做的事情 所以如果您有建议 请随时扔掉它们 Problem 最基本的需求是客户端 移动设备
  • 在 webpack 中使用 file-loader 和 html-loader 时,图像的 src attr 为“[object Module]”

    我正在从头开始使用 webpack4 做一个项目 但是当我尝试在 HTML 文件中显示图像时 我遇到了一个奇怪的问题 后npm run build 图像标签的src构建为
  • Scala 中需要 @tailrec 注解吗? [复制]

    这个问题在这里已经有答案了 我了解递归函数的问题以及堆栈溢出问题的风险 但是 如果一个函数能够针对尾递归进行优化 那么为什么不自动应用此优化 即 为什么我需要标记一个可以优化的函数 tailrec 如果一个函数能够针对尾递归进行优化 那么为
  • 将 purrr::map2() 与 dbplyr 一起使用

    我试图从一个表 位置 中选择行 其中特定列 位置 的值落在另一个表 my ranges 中定义的范围内 然后从 我的范围 表 我可以使用 tibbles 和几个来做到这一点purrr map2调用 但相同的方法不适用于 dbplyr 数据库
  • Java:迭代开始和结束日期,最佳实践?

    迭代开始日期和结束日期的最佳实践是什么 我曾经使用过以下的变体日期迭代器 http helpdesk objects com au java how can i iterate through all dates in a range 不确
  • UIScrollView 中的 UICollectionView -> 滚动顺序

    我有一个UICollectionView里面一个UIScrollView 我的计划是 如果UICollectionView到达顶部或底部 外部 ScrollView 获取滚动手势 如果外 ScrollView 到达顶部或底部 Collect
  • 奇怪的语义错误

    我已在新的 Linux 主机上重新安装了 emacs 24 2 50 并基于以下内容启动了新的 dotEmacs 配置magnars https github com magnars emacs demacs 配置 由于我在之前的工作流程中
  • PHP脚本自动创建文件结构表示[重复]

    这个问题在这里已经有答案了 可能的重复 PHP 遍历文件夹并显示 HTML 内容 https stackoverflow com questions 2769175 php iterate through folders and displ
  • getActivity() 找不到符号 symbol :方法 getActivity()

    我需要有关我的彩信应用程序的此文件的帮助 getActivity 导致构建错误 Error cannot find symbol method getActivity 到目前为止 我已经尝试了很多方法来使这项工作正常进行 例如extends
  • 无法使用装饰器覆盖类对象的 str 结果

    请参阅下面我的回答 发布问题后我意识到发生了什么事 我尝试使用装饰器覆盖类的字符串表示形式不起作用 我一定错过了一些东西 但不知道它是什么 from functools import wraps def str dec obj wraps