Python __reverse__魔术方法

时间:2014-12-24 15:17:10

标签: python class python-2.7 reverse

我正在尝试这段代码,希望在使用[::-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__

2 个答案:

答案 0 :(得分:7)

[::-1]切片object.__reversed__()使用reversed() function,仅适用于序列(同时提供__len____getitem__方法的对象。< / p>

如果您不提供__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']

答案 1 :(得分:0)

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

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

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