为什么Python允许在不调用它的情况下提及方法?

时间:2017-05-25 07:29:39

标签: python

我在查找错误时遇到了一些麻烦:我写了

myfile.close

而不是

myfile.close()

我很惊讶并且有点不高兴python没有反对;怎么会? BTW文件没有关闭。 (Ubuntu上的python 2.7)

6 个答案:

答案 0 :(得分:3)

在python方法中是第一类对象,你可以这样写:

my_close = myfile.close
my_close()

因为表达式不必分配给某个变量

2 + 3

一个简单的

myfile.close

也有效。

答案 1 :(得分:1)

这是因为myfile.close返回一个方法。

如果您执行print(myfile.close),您将获得如下输出:

<built-in method close of file object at 0x7fb672e0f540>

答案 2 :(得分:1)

Python文件对象具有内置方法close()来处理文件对象。 在您的情况下,myfile.close将返回方法对象引用,但不会被调用。

这个例子可能有助于理解这一点:

>>> def test():
...     print 'test print'
... 
>>> a = test
>>> print(a)
<function test at 0x7f6ff1f6ab90>
>>> 

答案 3 :(得分:1)

myfile.close是类文件对象的成员函数。您的代码只是“提及”此功能,但不会调用它(这就是文件未关闭的原因)。

这与此相同:

a = 5
a # OK but does nothing

def test():
    return 256
test # also not an error, but useless in this case

现在,你可能会说,为什么即使这完全无用也允许这个?嗯,不太好。有了这个,您可以将函数作为参数传递给其他函数,例如。

def MyMap(function, iterable):
    for x in iterable:
        yield function(x)

print(list(MyMap(str, range(5))))

答案 4 :(得分:1)

fp.close是文件对象的方法。

>>> fp.close
<built-in method close of file object at 0xb749c1d8>

fp.close()是使用()

进行方法调用的方法
>>> fp.close()

您可以按照演示更详细地了解。

我们定义test函数,我们testtest()看到差异。

>>> def test():
...   return 1
... 

>>> test
<function test at 0xb742bb54>

>>> test()
1

答案 5 :(得分:0)

您的代码不会抛出错误,因为您不必为表达式的结果指定名称(编辑:或语句)。 Python允许这样做,因为你可能只需要表达式/语句来获得某种副作用,而不是实际的返回值。

在推进迭代器而不为生成的对象指定名称时,通常会看到这种情况,即只有一行

next(myiter, None)
代码中的

如果你想要没有副作用的表达式,比如

1 + 1

myfile.close

如果没有为结果分配名称(因此表达式没用)则抛出错误Python必须检查表达式的每个右侧是否存在可能的副作用。与仅仅允许这些表达式的当前行为相比,这似乎是不必要的昂贵(并且对于每个表达式也是非常复杂的,如果不是不可能的话)。

考虑动态Python是怎样的。您可以覆盖+运算符在运行时对某些类型执行的操作。