class HelloForEver:
def readline(self):
return 'Hello.\n'
class HelloFile(HelloForEver):
def __init__(self, n):
self.n = n
def readline(self):
if self.n == 0:
return ''
self.n = self.n - 1
return super().readline()
'''
Example:
f = HelloFile(3)
f.readline()
Out: 'Hello.\n'
'''
class HelloFileIterator(HelloFile):
def __iter__(self):
return self
def __next__(self):
line = self.readline()
if line == '':
raise StopIteration
return line
f = HelloFileIterator(3)
print(f is iter(f))
for line in f:
print(line)
'''
Out:
Hello.
Hello.
Hello.
'''
class EmptyFile(HelloFileIterator):
def readline(self):
return ''
f = EmptyFile(3)
next(f)
class HelloFileIterator(HelloFile):
def __enter__(self):
return self
def __exit__(self,exception_type,exception_value,traceback):
pass
def __next__(self):
line = self.readline()
if line == '':
raise StopIteration
return line
def __iter__(self):
return self
with HelloFileIterator(3) as f:
for line in f:
print(line)
'''
'Hello.\n' ではなくて、
初期時に指定された文字列を繰り返し返すように、
新たなクラス StringFileIterator を定義してください。
'''
class StringFileIterator:
def __init__(self, s, n):
self.s = s
self.n = n
def __iter__(self):
return self
def __next__(self):
if not self.n:
raise StopIteration
else:
self.n -= 1
return self.s
'''
class HelloFileIterator(HelloFile):
def __iter__(self):
return self
def __next__(self):
line = self.readline()
if line == '':
raise StopIteration
return line
'''
class StringFileIterator(HelloFileIterator):
def __init__(self, s, n):
self.s = s
self.n = n
def readline(self):
if self.n == 0:
return ''
self.n = self.n - 1
return self.s
f = StringFileIterator('abc', 3)
print(list(f) == ['abc','abc','abc'])