2016-06-05 1 views
9

Если мы определим __str__ метод в классе:Как преобразовать пользовательский объект класса в кортеж в Python?

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


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

Таким образом, мы можем преобразовать свой объект сразу ул:

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

Но, насколько я знаю, не существует такой __tuple__ магический метод, поэтому я не знаю, как определить класс, который может перейти на tuple(), чтобы мы могли сразу преобразовать его объект в кортеж.

+4

Дайте нам пример кода, который вы хотели бы преобразовать в кортеж, чтобы мы могли помочь. Также проверьте это: http://stackoverflow.com/questions/12836128/python-convert-list-to-tuple -> Он относится к спискам, но может помочь вам. –

ответ

13

«Функция» (это действительно тип, но это означает, что вы можете назвать его как функцию), в качестве аргумента будет принимать любой итеративный, в том числе итератор. Поэтому, если вы хотите преобразовать свой объект в кортеж, просто убедитесь, что он повторяется. Это означает реализацию метода __iter__, который должен возвращать итератор. например

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

Вы можете видеть из примера, что несколько функций Python/типов будут принимать итератор в качестве аргумента и использовать последовательность значений, которые он генерирует в производстве результата.

+0

Я нахожу, что мы можем [определить метод '__getitem__', чтобы сделать класс итерабельным] (http://stackoverflow.com/questions/926574/why-does-defining-getitem-on-a-class-make-it-iterable- in-python) тоже. – acgtyrant

+0

Я объяснил итерационные протоколы в [разговоре с PyData London] (https://github.com/steveholden/iteration) в начале этого года. Это может помочь - есть [также видео сеанса] (https://www.youtube.com/watch?v=iTwrF1DofCY). – holdenweb

Смежные вопросы