我遇到了一些麻煩找我的錯誤:我寫了爲什麼Python允許提到一個方法而不調用它?
myfile.close
,而不是
myfile.close()
我很吃驚,也有點不滿,認爲蟒蛇不反對;怎麼來的? BTW文件沒有關閉。 (Python 2.7版在Ubuntu)
我遇到了一些麻煩找我的錯誤:我寫了爲什麼Python允許提到一個方法而不調用它?
myfile.close
,而不是
myfile.close()
我很吃驚,也有點不滿,認爲蟒蛇不反對;怎麼來的? BTW文件沒有關閉。 (Python 2.7版在Ubuntu)
在Python方法都是一流的對象,你可以寫這樣的事情:
my_close = myfile.close
my_close()
由於表達沒有被分配到一些變量
2 + 3
簡單
myfile.close
是有效的,太。
這是因爲myfile.close
返回一個方法。
如果你這樣做print(myfile.close)
,你會得到這樣的輸出:
<built-in method close of file object at 0x7fb672e0f540>
的Python文件對象有內置的方法close()
處理文件對象。 在你的情況下,myfile.close
將返回方法對象引用,但它沒有被調用。
這個例子將可能有助於明白這一點:
>>> def test():
... print 'test print'
...
>>> a = test
>>> print(a)
<function test at 0x7f6ff1f6ab90>
>>>
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))))
fp.close
是文件對象的方法。
>>> fp.close
<built-in method close of file object at 0xb749c1d8>
fp.close()
是方法調用使用()
>>> fp.close()
您可以通過下面的演示更多的細節瞭解。
我們定義了test
函數,我們是test
和test()
來看差異。
>>> def test():
... return 1
...
>>> test
<function test at 0xb742bb54>
>>> test()
1
因爲您不必爲表達式(編輯:或語句)的結果指定名稱,所以您的代碼不會引發錯誤。 Python允許這樣做,因爲它可能只是你需要表達式/語句的某種副作用而不是實際的返回值。
這不會對產生對象分配一個名稱前進一個迭代時,即只具有代碼中的一個線
next(myiter, None)
屢見不鮮。
如果你想表達,沒有副作用像
1 + 1
或
myfile.close
拋出一個錯誤,如果沒有分配給結果名稱(因此表達是沒用的)的Python會必須檢查表達式的每個右手邊以尋找可能的副作用。與目前只允許這些表達式的行爲相比,這似乎是不必要的昂貴的(並且對於每個表達式來說也是非常複雜的,如果不是不可能的話)。
考慮Python是如何動態的。您可以在運行時覆蓋+
運算符對某些類型所做的操作。