2014-12-24 3 views
1

나는이 코드를 [::-1]으로 반전 한 후 텍스트 문자열을 반환하지만 작동하지 않을 것으로 예상하여이 코드를 사용하려고합니다.파이썬 __reverse__ 마법 메서드

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__ 기능을 호출하는 방법은 무엇입니까? 예 : > 25과 함께 __gt__이 호출됩니다. __reverse__은 무엇입니까?

답변

5

[::-1]슬라이스입니다. object.__reversed__() 대신 reversed() function에서 사용하고 시퀀스 (모두 __len____getitem__ 방법.

당신이 __reversed__ 제공하지 않는 경우는, 함수가 접근하는 __len____getitem__ 방법을 사용하여 제공하는 객체에만 적용됩니다 .

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'] 
__reversed__의 지수 자체는 반복자를 반환해야합니다
+0

@KarolyHorvath : whoops. –

+0

감사합니다. 응답이 유용했습니다. –

관련 문제