Python open()vs. .close()

时间:2016-12-06 17:34:18

标签: python

关于Python中的语法

为什么我们使用open("file")打开而不是"file".close()关闭它? 为什么不"file".open()或反close("file")

4 个答案:

答案 0 :(得分:9)

因为open()是一个函数,.close()是一个对象方法。 "file".open()没有意义,因为您暗示open()函数实际上是字符串"file"的类或实例方法。并非所有字符串都是有效的文件或要打开的设备,因此解释器应该如何处理"not a file-like device".open()将是不明确的。出于同样的原因,我们不会使用"file".close()

close("file")需要查找文件名,然后查找是否有当前进程拥有的文件句柄附加到该文件。这将是非常低效的,并且可能存在隐藏的陷阱,使其不可靠(例如,如果它不是文件,而是TTY设备呢?)。只需保持对打开的文件或设备的引用并通过该引用(也称为句柄)关闭文件,它会更快更简单。

许多语言采用这种方法:

f = open("file") # open a file and return a file object or handle
# stuff...
close(f)         # close the file, using the file handle or object as a reference

这与您的close("file")构造类似,但不要被愚弄:它通过直接引用来关闭文件,而不是存储在字符串中的文件名。< / p>

Python开发人员选择做同样的事情,但它看起来不同,因为他们用面向对象的方法实现了它。部分原因是Python文件对象have a lot of methods可供他们使用,例如read()flush()seek()等。如果我们使用close(f) ,然后我们必须将其余文件对象方法的所有更改为函数,或者让它成为一个随机函数,其行为与其余函数不同,没有充分的理由。

<强> TL; DR
open()file.close()的设计与OOP主体和良好的文件引用实践一致。 open()是类似工厂的函数,它创建引用文件或其他设备的对象。创建对象后,该对象上的所有其他操作都通过类或实例方法完成。

答案 1 :(得分:1)

只比你稍微少一些,但是我会给这个一个去,基本上打开和关闭是像python这样的语言完全不同的动作。当你打开文件时,你真正在做的是创建一个在你的应用程序中工作的对象来表示文件,所以你用一个函数创建它,通知操作系统文件已被打开并创建一个python可以对象的对象用于读取和写入文件。当关闭文件时,基本上需要做的是让你的应用程序告诉操作系统它已完成文件并处理代表文件的内存对象,最简单的方法是使用对象本身的方法。另请注意,像"file".open这样的语法要求字符串类型包含打开文件的方法,这将是一个非常奇怪的设计,并且需要对字符串类型进行大量扩展,以用于您希望使用该语法实现的任何其他内容。 close(file)会更有意义,但仍然是一个笨重的方式来释放该对象/让操作系统知道文件不再打开,你将传递一个表示创建的对象的变量file当您打开文件而不是指向文件路径的字符串时。

答案 2 :(得分:1)

通常你不应该明确地使用"file".close(),而是使用open(file)作为上下文管理器,这样如果发生异常,文件句柄也会被关闭。问题结束: - )

但是为了实际回答你的问题我假设原因是open支持许多选项,并且返回的类根据这些选项而不同(另请参阅io module)。因此,对于最终用户来说,记住他想要哪个类然后使用正确的类本身的"class".open会更加复杂。请注意,您还可以传递要包装的文件的整数文件描述符。&#34;到open,这意味着除了str.open()方法之外,您还可以获得int.open()。这将是非常糟糕的OO设计,但也令人困惑。我不会想到会在StackOverflow上询问哪些问题("door".open()(1).open())......

但是我必须承认有一个pathlib.Path.open功能。但如果你有一条路径,那就不再模棱两可了。

对于close()函数:每个实例已经有一个close()方法,并且不同类之间没有差异,那么为什么要创建一个额外的函数呢?根本没有优势。

答案 3 :(得分:1)

除了已经说过的内容之外,我引用Python中的更改日志来删除内置的file类型。它(简要地)解释了为什么在Python 3中删除了使用file类型(Python 2中提供)的类构造函数方法:

  

删除了文件类型。使用open()。现在有几种不同类型的流可以在io模块中返回。

基本上,虽然file("filename")会创建file的实例,但open("filename")可以返回不同流类的实例,具体取决于模式。

https://docs.python.org/3.4/whatsnew/3.0.html#builtins