【问题标题】:Python __reverse__ magic methodPython __reverse__ 魔术方法
【发布时间】:2014-12-24 15:17:10
【问题描述】:

我正在尝试这段代码,期望它在使用[::-1] 反转后返回一串文本,但它不起作用。

class meh:
  def __init__(self, bla):
    self.bla = bla
  def __reversed__(self):
    return "Reversing!!!! %s" % self.bla[::-1]

a = meh("Reversed successfully!!!!")
print a[::-1]

如何正确调用__reverse__函数? 示例:__gt__> 25 一起调用,什么调用 __reverse__

【问题讨论】:

    标签: python class python-2.7 reverse


    【解决方案1】:

    [::-1] 是一个切片object.__reversed__()reversed() function 使用,并且仅适用于序列(同时提供__len____getitem__ 方法的对象)。

    如果您不提供__reversed__,该函数将使用__len____getitem__ 方法反向访问索引。 __reversed__ 本身必须返回一个迭代器:

    class Reversable(object):
        def __init__(self, seq):
            self.seq = seq
    
        def __len__(self):
            return len(self.seq)
    
        def __getitem__(self, item):
            return self.seq[item]
    
        def __reversed__(self):
            for elem in 'Reversing: ' + self.seq[::-1]:
                yield elem
    

    演示:

    >>> class Reversable(object):
    ...     def __init__(self, seq):
    ...         self.seq = seq
    ...     def __len__(self):
    ...         return len(self.seq)
    ...     def __getitem__(self, item):
    ...         return self.seq[item]
    ...     def __reversed__(self):
    ...         for elem in 'Reversing: ' + self.seq[::-1]:
    ...             yield elem
    ... 
    >>> r = Reversable('Foo bar baz!')
    >>> list(r)
    ['F', 'o', 'o', ' ', 'b', 'a', 'r', ' ', 'b', 'a', 'z', '!']
    >>> list(reversed(r))
    ['R', 'e', 'v', 'e', 'r', 's', 'i', 'n', 'g', ':', ' ', '!', 'z', 'a', 'b', ' ', 'r', 'a', 'b', ' ', 'o', 'o', 'F']
    

    【讨论】:

      【解决方案2】:

      从 Python 2.4 开始,列表确实有 reverse() 方法

      r= list("asdfasdf")
      r.reverse()
      print(r)
      print(''.join(r))
      

      ['f', 'd', 's', 'a', 'f', 'd', 's', 'a']
      fdsafdsa
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-11-29
        • 1970-01-01
        • 2015-09-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-08
        • 1970-01-01
        相关资源
        最近更新 更多