【问题标题】:Is it possible to overload the ~ operator on strings?是否可以在字符串上重载 ~ 运算符?
【发布时间】:2017-02-05 18:55:40
【问题描述】:
>>> a = 55
>>> b = "hello"
>>> ~a  # this will work
>>> ~b  # this will fail

上面的失败并不令人意外,但假设我想重载 ~ 运算符来处理字符串。我对 Python 还很陌生,所以我对此进行了一些挖掘,并发现了一些我无法工作的诱人建议。我知道我可以创建某种新类,但我希望以下内容也能正常工作:

>>> ~"alpha bravo"

这可能吗?如果是这样,怎么做?这种超载怎么办?

【问题讨论】:

  • 如果你觉得很勤奋,那么你可以编写一个前端来解析代码并根据需要修改 AST。
  • 您究竟希望~'alpha bravo' 做什么?也许还有其他数据结构(字符串除外)可以满足您的需求?
  • 我一直很享受最近对 C# 的一项更改,该更改取自 PHP(可能取自其他地方)并将变量嵌入字符串中。在我意识到我可以相当容易地实现myformat( "You have {beers} on the wall.") 之后,我开始考虑~"You have {beers} on the wall"。这些是人们在尝试更多地了解一门语言时会想到的事情。
  • You can have it soon in python 3.6,它看起来像f"You have {beers} on the wall."。

标签: python string overloading operator-keyword


【解决方案1】:

不,这在 Python 中是不可能的。您无法以可靠的方式向内置类型添加新方法。

您可以做的一件事是子类化字符串,并定义魔术方法__invert__。但它不适用于字符串文字,仅适用于您的子类的实例。

【讨论】:

  • forbiddenfruit 不起作用(我知道还是不建议...)?
  • forbiddenfruit 可以通过可怕的 hack 为您添加方法,但仅在直接调用时无法通过操作员工作。
  • 这当然有点令人失望。我怀疑这是不可能的,但我不确定。我认为值得询问那些有更多经验的人。见我上面的注释。也许这是值得建议作为未来语言功能的东西。其他语言开发人员并没有忘记这种格式化输出的原则。
  • 其实已经完成了——见PEP-0498
  • 天啊...我怎么会错过呢?我不记得在我读过的任何教程中。嗯,我有一些新东西可以玩。
猜你喜欢
  • 2017-05-06
  • 1970-01-01
  • 2015-01-01
  • 2012-09-04
  • 2010-10-20
  • 2010-10-21
  • 1970-01-01
  • 1970-01-01
  • 2023-04-05
相关资源
最近更新 更多