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。