このトピックに関する本Core Python Programmingの例がDelegation
機能していないようです..または、トピックを明確に理解していなかった可能性があります..
以下は、クラスがオブジェクトをCapOpen
ラップし、モードで開かれたときの変更された動作を定義するコードです。すべての文字列を大文字のみで書き込む必要があります。file
file
write
ただし、読み取り用にファイルを開いて、それを繰り返し処理して各行を印刷しようとすると、次の例外が発生します。
Traceback (most recent call last):
File "D:/_Python Practice/Core Python Programming/chapter_13_Classes/
WrappingFileObject.py", line 29, in <module>
for each_line in f:
TypeError: 'CapOpen' object is not iterable
これは奇妙です。イテレータ メソッドを明示的に定義していませんが__getattr__
、基になるfile
オブジェクトを介して呼び出しが委任されることを期待していたからです。これがコードです。私は何かを逃したことがありますか?
class CapOpen(object):
def __init__(self, filename, mode='r', buf=-1):
self.file = open(filename, mode, buf)
def __str__(self):
return str(self.file)
def __repr__(self):
return `self.file`
def write(self, line):
self.file.write(line.upper())
def __getattr__(self, attr):
return getattr(self.file, attr)
f = CapOpen('wrappingfile.txt', 'w')
f.write('delegation example\n')
f.write('faye is good\n')
f.write('at delegating\n')
f.close()
f = CapOpen('wrappingfile.txt', 'r')
for each_line in f: # I am getting Exception Here..
print each_line,
Python 2.7 を使用しています。