File类型的对象必须支持迭代协议,并遍历文件的行

时间:2017-11-28 21:22:54

标签: python class magic-methods

所以,我有一些在python中创建类的任务:

  • 有人可以让我审核我的代码。
  • 我需要使用Magic Methods来完成任务。

这是我的任务:

1)必须在完整路径中初始化类。

,例如

obj = File('/tmp/file.txt')

2)该类必须支持write方法。

3)File类型的对象必须支持添加。

4)File类型的对象必须支持迭代协议,并遍历文件的行。

for line in File('/tmp/file.txt'):

在这里我遇到了一个问题,因此我有一个无限循环。

5)使用打印功能输出文件时,应打印完整路径,并在初始化时传递。

这是我的代码:

import os

class File:

def __init__(self, file_path, content = None):
    self.file_path = file_path
    self.content = content
    try:
        with open(file_path) as file_to:
            self.content = file_to.read()
    except FileNotFoundError:
        print("File or directory does not exist!\nEnter existing directory")


def write(self, line):
    self.line = line
    with open(self.file_path, 'a+') as file_to:
        file_to.write(self.line)

def __add__(self, obj):
        with open('result.txt', 'a+') as new_file:
            new_file.write(self.content + obj.content)

def __iter__(self):
    return self

def __next__(self):
    self.stop = 0
    with open(self.file_path) as f:
        data = f.readlines()
    if self.stop > len(data):
        raise StopIteration

    self.stop += 1

    return data 

def __str__(self):
    return f"{self.file_path}"

1 个答案:

答案 0 :(得分:0)

  

这里我有一个问题,因此我有一个无限循环。

每次File实例上的 调用下一个方法时,您都会重新打开文件并读取它。连续next次调用不会因__next__不断返回相同的数据而结束。

您可以直接从__iter__

返回文件内容上的迭代器
class File:

    def __init__(self, file_path):
        self.file_path = file_path
        try:
            with open(file_path) as file_to:
                self.content = file_to.readlines()
        except FileNotFoundError:
            print("File or directory does not exist!\nEnter existing directory")
            raise

    def __iter__(self):
        return iter(self.content)

要使类实例成为迭代器,即实现迭代器协议,您可以在__iter__中返回self,并在__next__中返回文件的行:

class File:

     def __init__(self, file_path):
        ...
        self._index = 0 

    def __iter__(self):
        return self

    def __next__(self):
        try:
           return self.content[self._index]
        except IndexError:
           raise StopIteration
        self._index += 1