首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >文件编辑类

文件编辑类
EN

Code Review用户
提问于 2017-12-24 00:01:14
回答 1查看 206关注 0票数 5

我正在制作这个文件编辑类(写入文件、读取文件等)。在Python中,只是在寻找任何反馈。

注意:我一直在考虑删除file_name属性,并在每个方法调用中要求文件名。

代码语言:javascript
复制
import os

class EditFile:

    """
    format: <object_name> = EditFile(<file_name>)
    """

    # constructor
    def __init__(self, file_name):
        self.file_name = file_name  # can be changed at any time

    # string version
    def __repr__(self):
        return "<object_name> = EditFile(<file_name>)"

    # methods
    def write(self, text):  # writes text in a file
        try:
            f = open(self.file_name, "w")  # opens file & selects WRITE mode also creates a new file if it doesnt exist
            f.write(str(text))

        finally:
            f.close()

    def append(self, text):  # appends text to a file
        try:
            f = open(self.file_name, "a")  # opens file & selects APPEND mode
            f.write(text)

        finally:
            f.close()

    @property
    def read(self):  # reads the file
        try:
            f = open(self.file_name, "r")  # opens file & selects READ mode
            content = f.read()  # saves content of the file into content variable

        finally:
            f.close()

        return content  # returns content of the file

    def read_bytes(self, number_of_bytes = 0):  # reads certain amount of bytes
        try:
            int(number_of_bytes)

            if number_of_bytes == 0:  # checks if its default
                f = open(self.file_name, "rb")
                content = f.read()

                return content

            elif number_of_bytes >= 1:  # checks if number of bytes is a valid number
                f = open(self.file_name, "rb")
                content = f.read(number_of_bytes)

                return content

            else:
                return "error"  # returns "error" if input is invalid

        except ValueError:
            return "value error"

        finally:
            f.close()

    def write_bytes(self, text):  # writes in bytes
        try:
            f = open(self.file_name, "wb")  # selects WRITE BYTES mode
            f.write(str(text))

        finally:
            f.close()

    @property
    def clear(self):  # clears a file
        try:
            f = open(self.file_name, "w")  # opens file and selects WRITE mode
            f.write("")  # sets file content to none

        finally:
            f.close()

    @property
    def delete(self):  # deletes current file
        try:
            os.remove(self.file_name)  # tries to delete file

        except OSError:
            return "error"  # returns "error" if an error occurs (eg file doesnt exist)

# example program using most of the methods
file = EditFile("editme.txt")

file.write(str(input("Text:\n")))
print(file.read)
file.clear
file.delete

# editing file: editme2.txt
file.file_name = "editme2.txt"
file.write(str(input("Text:\n")))
print(file.read_bytes(5))
file.delete
EN

回答 1

Code Review用户

回答已采纳

发布于 2017-12-24 09:30:46

代码语言:javascript
复制
"<object_name> = EditFile(<file_name>)"

不是一个特别有用的__repr__。请注意数据模型文档中的指南:

如果可能的话,这应该看起来像一个有效的Python表达式,可以用来重新创建具有相同值的对象(给定适当的环境)。如果这是不可能的,则应该返回表单<...some useful description...>的字符串。

在这种情况下,这可能是:

代码语言:javascript
复制
"EditFile({!r})".format(self.file_name)

对于所有文件访问,您应该使用open提供的上下文管理器,例如:

代码语言:javascript
复制
@property
def read(self):  # reads the file
    with open(self.file_name) as f:
        return f.read()

这将在方法结束后为您处理关闭文件的问题。

read是一个属性,这似乎很奇怪,但是read_bytes是一个方法--后者需要一个参数,两个名称都描述操作,也许它们都应该是方法?如果您仍然想要这个属性,那么描述一个东西的名称(比如content )会更好。

我通常希望属性访问不会改变状态,因此cleardelete (同样是操作而不是事物)成为属性似乎更奇怪。给他们弄点方法。而且,对于类的使用者来说,返回None (如果成功)或返回字符串(如果有错误)是一个非常奇怪的接口。

一般来说,您的错误处理有点奇怪。为什么要取一个有用的异常,然后把它压缩成一个没有意义的字符串?你给你的类的用户提供了更少的信息。如果您不能添加到它们或有效地处理它们,让错误继续通过您的代码调用者。而不是:

代码语言:javascript
复制
return "error"  # returns "error" if input is invalid

自己用一条有用的信息引发错误,在这种情况下例如:

代码语言:javascript
复制
raise ValueError("cannot read a negative number of bytes")

这实际上告诉了用户一些有用的东西。

还注意到:

代码语言:javascript
复制
int(number_of_bytes)

虽然它检查number_of_bytes可以是一个整数,但实际上并没有改变分配给名称的内容;例如,如果它是'1',那么接下来就会发生奇怪的事情。相反,使用结果:

代码语言:javascript
复制
number_of_bytes = int(number_of_bytes)

与其使用简单的注释来描述您的方法,不如使用文档字符串

代码语言:javascript
复制
def write_bytes(self, text):
    """Writes in bytes."""
    ...

与注释不同,这些可以被其他工具使用,例如内置的help函数,以其他形式提供这些信息。

代码语言:javascript
复制
self.file_name = file_name  # can be changed at any time

下面是@property的一个很好的用途;您可以使用它使文件名按约定只读:

代码语言:javascript
复制
self._file_name = file_name

前面的下划线表示这应该是私有的,然后您可以编写一个getter:

代码语言:javascript
复制
@property
def file_name(self):
    return self.file_name

您的另一个想法是,每次调用方法时都需要文件名,它将把它变成一个没有任何实例状态的类,在这种情况下,它可能根本就不是类。

票数 8
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/183529

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档