【问题标题】:Classes: Alternative way of adding len()类:添加 len() 的替代方法
【发布时间】:2013-06-05 21:55:35
【问题描述】:

我正在构建一个字符串类,它的行为类似于常规字符串类,除了加法运算符返回两个字符串的长度之和而不是连接它们。然后乘法运算符返回两个字符串长度的乘积。所以我打算做

   class myStr(string):
         def __add__(self):
             return len(string) + len (input)

至少这是我第一部分的内容,但这显然是不正确的。谁能帮我纠正一下。

【问题讨论】:

  • 请始终发布您的代码给您的完整错误。
  • 为什么要这样做?这是一个非常奇怪的设计。 一个字符串的对象,并以各种方式使用它,甚至将一些方法直接委托给字符串……这还不错。但是一个对象 是一个 字符串,并且以非字符串的方式执行一些操作,这只会令人困惑。
  • 另外,请注意,一旦你做对了,myStr('abc') + 'def' 将是 6,但 'abc' + myStr('def') 将是 'abcdef'。而且,更糟糕的是,s = myStr('abc'); s += myStr('def') 会将 s 设置为 6。这真的是你想要的吗?
  • @abarnert 这是作业。同一用户还有其他类似类型的作业问题。
  • @Marcin:我开始怀疑她需要一个更好的教授(或教程或其他)。任何愿意做这项作业的人要么是故意混淆他的学生,要么是因为 60 年代的 LDS^H^H^HLOOPS 太多而感到困惑……

标签: python string operator-overloading


【解决方案1】:

需要从str派生,可以使用len(self)获取当前实例的长度。您还需要为+ 运算符的另一个操作数提供参数__add__

class myStr(str):
    def __add__(self, other):
        return len(self) + len(other)

演示:

>>> class myStr(str):
...     def __add__(self, other):
...         return len(self) + len(other)
... 
>>> foo = myStr('foo')
>>> foo
'foo'
>>> foo + 'bar'
6

【讨论】:

  • 你不需要str.__len__(self)superlen(self) 工作得很好。 (他没有覆盖__len__,所以myStr.__len__ 是与str.__len__ 完全相同的方法。)
【解决方案2】:

string 不是一个类。这不是什么*。除非您定义string,否则len(string) 将无法工作。

其次,__add__ 没有input 参数。

您需要解决这两个问题。

* 您可以导入一个名为string 的模块,但它不只是存在于全局范围内。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-04
  • 2012-07-14
  • 2015-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多