我正在制作这个文件编辑类(写入文件、读取文件等)。在Python中,只是在寻找任何反馈。
注意:我一直在考虑删除file_name属性,并在每个方法调用中要求文件名。
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发布于 2017-12-24 09:30:46
"<object_name> = EditFile(<file_name>)"不是一个特别有用的__repr__。请注意数据模型文档中的指南:
如果可能的话,这应该看起来像一个有效的Python表达式,可以用来重新创建具有相同值的对象(给定适当的环境)。如果这是不可能的,则应该返回表单
<...some useful description...>的字符串。
在这种情况下,这可能是:
"EditFile({!r})".format(self.file_name)对于所有文件访问,您应该使用open提供的上下文管理器,例如:
@property
def read(self): # reads the file
with open(self.file_name) as f:
return f.read()这将在方法结束后为您处理关闭文件的问题。
read是一个属性,这似乎很奇怪,但是read_bytes是一个方法--后者需要一个参数,两个名称都描述操作,也许它们都应该是方法?如果您仍然想要这个属性,那么描述一个东西的名称(比如content )会更好。
我通常希望属性访问不会改变状态,因此clear和delete (同样是操作而不是事物)成为属性似乎更奇怪。给他们弄点方法。而且,对于类的使用者来说,返回None (如果成功)或返回字符串(如果有错误)是一个非常奇怪的接口。
一般来说,您的错误处理有点奇怪。为什么要取一个有用的异常,然后把它压缩成一个没有意义的字符串?你给你的类的用户提供了更少的信息。如果您不能添加到它们或有效地处理它们,让错误继续通过您的代码调用者。而不是:
return "error" # returns "error" if input is invalid自己用一条有用的信息引发错误,在这种情况下例如:
raise ValueError("cannot read a negative number of bytes")这实际上告诉了用户一些有用的东西。
还注意到:
int(number_of_bytes)虽然它检查number_of_bytes可以是一个整数,但实际上并没有改变分配给名称的内容;例如,如果它是'1',那么接下来就会发生奇怪的事情。相反,使用结果:
number_of_bytes = int(number_of_bytes)与其使用简单的注释来描述您的方法,不如使用文档字符串:
def write_bytes(self, text):
"""Writes in bytes."""
...与注释不同,这些可以被其他工具使用,例如内置的help函数,以其他形式提供这些信息。
self.file_name = file_name # can be changed at any time下面是@property的一个很好的用途;您可以使用它使文件名按约定只读:
self._file_name = file_name前面的下划线表示这应该是私有的,然后您可以编写一个getter:
@property
def file_name(self):
return self.file_name您的另一个想法是,每次调用方法时都需要文件名,它将把它变成一个没有任何实例状态的类,在这种情况下,它可能根本就不是类。
https://codereview.stackexchange.com/questions/183529
复制相似问题