为什么open()和.read()的语法不同?

时间:2012-04-01 13:13:42

标签: python syntax

这是一个新手问题,但我环顾四周,我无法找到任何特定于这个问题的东西(也许是因为它对其他人来说太简单/明显)。

所以,我正在通过Zed Shaw的“以艰难的方式学习Python”,我正在进行练习15.这不是我第一次接触python,但这次我真的试图以更基本的方式理解它因此我可以用编程语言做一次真正的事情。我还应该警告我没有良好的面向对象编程背景或完全内化了对象,类等等。

无论如何,这是练习。想法是理解基本的文件打开和阅读:

from sys import argv

script, filename = argv

txt = open(filename)

print "Here's your file %r:" % filename
print txt.read()

print "I'll also ask you to type it again:"
file_again = raw_input("> ")

txt_again = open(file_again)

print txt_again.read()

txt.close()
txt_again.close()

我的问题是,为什么openread函数使用不同?

例如,要阅读示例文件,为什么不能/不能在第8行键入print read(txt)? 为什么我在变量前面加一个句点和后面的函数?
或者,为什么第5行不写txt = filename.open()

这让我很困惑。是一些函数只有一种语法而另一种语法是另一种语法吗?或者我不理解将变量传递给函数的方法。

3 个答案:

答案 0 :(得分:4)

语法

具体到语法差异: open()是一个函数, read()是一个对象方法

当您调用 open()函数时,它会返回一个对象(第一个 txt ,然后是 txt_again )。

txt 是类文件对象。类文件的对象使用方法 read()定义。所以,在上面的代码中:

txt = open(filename)

调用 open()函数并将类文件的对象分配到 txt

之后,代码:

txt.read()

调用与对象 txt 关联的方法 read()

物件

在这种情况下,重要的是要了解对象不仅被定义为数据实体,还被定义为针对这些实体的内置操作。

e.g。类 car 的假设对象可以使用方法定义,例如 start_engine() stop_engine() open_doors()

因此,与上面的文件示例并行,创建和使用汽车的代码可能是:

my_car = create_car(type_of_car)
my_car.start_engine()

(Wikipedia entry on OOP.)

答案 1 :(得分:2)

要回答这个问题,你应该对面向对象的编程有一些了解。

open()是一个普通函数,第一个参数是一个字符串,带有文件的路径。该函数的返回值是一个对象。

使用此对象完成了进一步的工作。对象也有函数,但它们被称为方法。这些方法在此对象的上下文中调用,该点将对象与方法连接起来。所以txt.read()意味着你要从txt-object调用read方法。

但如果你真的想了解这一点,你应该看看OOP。

答案 2 :(得分:0)

你遇到了方法与功能。

open是一个全局函数,它只是括号之间的参数。

read是一种文件对象的方法。表达式txt.read()调用read对象的txt方法。在引擎盖下,txt对象作为其read方法的第一个参数传递。 read方法的定义如下:

class File(object):
     def read(self):
         # do whatever here
         # self is whatever object appears to the left of the dot in foo.read

根据上面的定义,您只能在对象上使用read之类的方法,该对象具有为其定义的读取方法。