首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python open()与.close()

Python open()与.close()
EN

Stack Overflow用户
提问于 2016-12-07 01:34:18
回答 4查看 3.2K关注 0票数 8

关于Python中的语法

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

为什么不是"file".open()或者相反的close("file")

EN

回答 4

Stack Overflow用户

发布于 2016-12-07 01:45:52

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

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

许多语言都采用这种方法:

代码语言:javascript
复制
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")构造,但不要上当:它通过对文件的直接引用来关闭文件,而不是存储在字符串中的文件名。

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

TL;DR

open()file.close()的设计符合OOP原则和良好的文件引用实践。open()是一个类似工厂的函数,用于创建引用文件或其他设备的对象。一旦创建了对象,对该对象的所有其他操作都是通过类或实例方法完成的。

票数 8
EN

Stack Overflow用户

发布于 2016-12-07 01:41:01

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

票数 1
EN

Stack Overflow用户

发布于 2016-12-07 01:52:01

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

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

然而,我必须承认有一个pathlib.Path.open函数。但是如果你有一条路径,它就不再是模棱两可的了。

至于close()函数:每个实例都有一个close()方法,不同的类之间没有区别,为什么还要创建一个额外的函数呢?这根本没有什么好处。

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

https://stackoverflow.com/questions/41001442

复制
相关文章

相似问题

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