简体   繁体   English

Python __reverse__ 魔术方法

[英]Python __reverse__ magic method

I'm trying this piece of code expecting that it returns a string of text after reversing with [::-1] but it is not working.我正在尝试这段代码,希望它在用[::-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]

How to properly call the __reverse__ function?如何正确调用__reverse__函数? Example: __gt__ is called with a > 25 , what calls __reverse__ ?示例: __gt__被称为> 25 ,什么叫__reverse__

[::-1] is a slice . [::-1]是一个切片 object.__reversed__() is instead used by thereversed() function , and is only applicable to sequences (objects that provide both a __len__ and a __getitem__ method). object.__reversed__()reversed()函数使用,并且仅适用于序列(同时提供__len____getitem__方法的对象)。

If you don't supply __reversed__ , the function uses those __len__ and __getitem__ methods to access indices in reverse.如果您不提供__reversed__ ,该函数将使用这些__len____getitem__方法来反向访问索引。 __reversed__ must itself return an iterator: __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

Demo:演示:

>>> 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']

Lists do havereverse() method since of Python 2.4从 Python 2.4 开始,列表确实有reverse()方法

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

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM