これは、すべてのように表現する方がはるかに簡単です
class Fib:
"""Implements the Fibonacci sequence."""
def __init__(self, max_):
self.max = max_
def __iter__(self):
"""Initializes and returns itself as an iterable."""
self.a = 0
self.b = 1
return self
def __next__(self):
"""What gets run on each execution of that iterable."""
fib = self.a
if fib > self.max:
raise StopIteration
self.a, self.b = self.b, self.a + self.b # increment
return fib
:何それがないことはこれです言われていること
、メソッドとは、メソッドが呼び出されたインスタンスオブジェクトへの参照を返すことを意味します。これは、method cascadingを奨励するfluent interfaceとして設計されたオブジェクト指向のAPIで使用されることがあります。したがって、たとえば、
>>> class Counter(object):
... def __init__(self, start=1):
... self.val = start
... def increment(self):
... self.val += 1
... return self
... def decrement(self):
... self.val -= 1
... return self
...
>>> c = Counter()
今、私たちは、メソッドのカスケード使用することができます。
>>> c.increment().increment().decrement()
<__main__.Counter object at 0x1020c1390>
お知らせを、decrement()
への最後の呼び出しはがself
である、<__main__.Counter object at 0x1020c1390>
を返しました。 は今:あなたがself
を返さなかった場合
>>> c.val
2
>>>
お知らせ、あなたがこれを行うことはできません。
>>> class Counter(object):
... def __init__(self, start=1):
... self.val = start
... def increment(self):
... self.val += 1
... # implicitely return `None`
... def decrement(self):
... self.val -= 1
... # implicitely return `None`
...
>>> c = Counter()
>>> c.increment().increment()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'increment'
>>> c
<__main__.Counter object at 0x1020c15f8>
>>> c.val
2
>>>
お知らせ、誰もが「方法カスケード」のデザインのファンです。 Pythonの組み込み関数は、これを行う傾向があるので、例えばlist
ません:
>>> x = list()
>>> x.append(1).append(2)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'append'
>>>
あなたはは、多くの場合、あなたのクラスは、イテレータのiter
がself
によってを返すiterator
プロトコルを実装したときにこれは見ない1位大会は、これはthe docsによって提案されたものの:
イテレータプロトコルの背後にある仕組みを見た、あなたのクラスにイテレータの振る舞いを追加 に簡単です。 __iter__()
メソッド を定義し、__next__()
メソッドを持つオブジェクトを返します。クラス は__next__()
を定義する場合は、__iter__()
だけself
を返すことができます。
class Reverse:
"""Iterator for looping over a sequence backwards."""
def __init__(self, data):
self.data = data
self.index = len(data)
def __iter__(self):
return self
def __next__(self):
if self.index == 0:
raise StopIteration
self.index = self.index - 1
return self.data[self.index]
お知らせを、効果で、これは単一のパスのためのあなたのイテレータはのみ有用になる:
>>> x = [1, 2, 3, 4]
>>> it = iter(x)
>>> list(it)
[1, 2, 3, 4]
>>> list(it)
[]
>>> next(it)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
>>>
は利益を定義? –
[ドキュメントの '' __iter__'](https://docs.python.org/3/reference/datamodel.html#object.__iter__)あなたはそこから読むことができます。短い答え: '__iter__'はイテレータに必要なので' self'を返します。 – Matthias
@Elliot Roberts何を使用していますか? – AmrElgendy