2016-06-05 11 views
9

Jeśli zdefiniujemy __str__ metodę w klasie:Jak przekonwertować niestandardowy obiekt klasy na krotkę w języku Python?

class Point(): 
    def __init__(self, x, y): 
     self.x = x 
     self.y = y 


    def __str__(self, key): 
     return '{},{}'.format(self.x, self.y) 

Więc możemy przekształcić swój przedmiot natychmiast STR:

a = Point(1, 1) 
b = str(a) 
print(b) 

Ale o ile wiem, nie ma takich __tuple__ magiczna metoda, więc nie wiem, jak zdefiniować klasę, która może przejść do tuple(), abyśmy mogli natychmiast przekonwertować jej obiekt na krotkę.

+4

Podaj nam przykład kodu, który chcesz przekonwertować na krotkę, abyśmy mogli Ci pomóc. Sprawdź również: http://stackoverflow.com/questions/12836128/python-convert-list-to-tuple -> Jest specyficzny dla list, ale może ci pomóc. –

Odpowiedz

13

"Funkcja" (jest to naprawdę typ, ale oznacza to, że można go nazwać jak funkcję), jako argument przyjmuje dowolną wartość iteracyjną, włącznie z iteratorem. Więc jeśli chcesz przekonwertować obiekt na krotkę, po prostu upewnij się, że jest iterowalna. Oznacza to implementację metody __iter__, która powinna zwrócić iterator. na przykład

>>> class SquaresTo: 
...  def __init__(self, n): 
...   self.n = n 
...  def __iter__(self): 
...   for i in range(self.n): 
...    yield i * i 
... 
>>> s = SquaresTo(5) 
>>> tuple(s) 
(0, 1, 4, 9, 16) 
>>> list(s) 
[0, 1, 4, 9, 16] 
>>> sum(s) 
30 

można zobaczyć na przykładzie, że niektóre funkcje Python/typy weźmie iterable jako argument i użyj sekwencji wartości, że generuje się w produkcji rezultatu.

+0

Uważam, że możemy [zdefiniować metodę '__getitem__', aby klasa była iterowalna] (http://stackoverflow.com/questions/926574/why-does-definicja-getitem-on-a-class-make-it-iterable- w-python) też. – acgtyrant

+0

Wyjaśniłem protokoły iteracyjne w [rozmowie z PyData London] (https://github.com/steveholden/iteration) na początku tego roku. To może pomóc - jest także [wideo z sesji] (https://www.youtube.com/watch?v=iTwrF1DofCY). – holdenweb

Powiązane problemy