歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Python 的 Magic Methods 指南

Python 的 Magic Methods 指南

日期:2017/3/1 9:49:25   编辑:Linux編程

介紹

本指南是數月博客的總結。主題是魔術方法。

什麼是魔術方法呢?它們是面向對象Python語言中的一切。它們是你可以自定義並添加“魔法”到類中的特殊方法。它們被雙下劃線環繞(比如__init__或__lt__)。它們的文檔也不像它所需要的那麼齊備。Python的所有魔術方法都在Python文檔的同一區域,但它們的使用分散,組織松散。而且文檔的這部分區域中幾乎沒有一個示例(這很有可能是設計好的,因為在語法參考裡它們都很詳盡,但伴隨的是枯燥的語法描述等等)。

因此,為了解決Python文檔中我認為的缺陷,我想提供一些更簡單直白的表述——示例驅動型的Python魔術方法文檔。我從每周的博客開始,現在我已經完成了,並把它們合到了一起。

我希望你能喜歡它。把它作為一個教程、復習或參考使用;它希望能成為一個Python魔術方法用戶友好的指導。

構造與初始化

我們每個知道的最基本的“魔法”方法是__init__。一種讓我們在初始化一個類時定義一些行為。然而當我執行 x = SomeClass(), __init__ 不是第一個被執行的。事實上,第一被執行的的方法是__new__,它會創建一個實例,然後在構造器創建時傳遞一些參數。在一個object的生命周期的另一端的方法是__del__。讓我們仔細看看這3個“魔法”方法:

  • __new__(cls, [...)

  • __new__ 是一個類的初始化過程中第一個被執行的方法。它創建了類,然後把一些參數傳遞給__init__。__new__ 很少被使用,特別是當我們用一些不可變類型的子類時(像tuple ,string),我不想關心__new__的太多的細節,因為那是沒有用的。但它有它存在的意義。更多詳細的請看 in the Python docs.

  • __init__(self, [...)

  • 類的構造器,當初始構造方法被執行(例如,我們執行 x = SomeClass(10,'foo')),__init__ 就會獲得 10 和 ‘foo’ 作為參數。__init__ 在python類的定義中經常被使用

  • __del__(self)

  • 若果 __new__ 和 __init__ 形成一個類的構造函數,__del__ 是就是析構函數。它不實現語句 del x 的行為(這樣代碼就不會轉換為 x.__del__())。它定義了一個被垃圾回收的行為。它在類消除的時後需要做一些額外的行為時是非常有用的,就像 sockets 和 file 類。注意,當編譯器還在運行,如果類還存活著,這裡不能確保__del__一定會被執行。所以__del__ 不能替代一些良好的編程習慣(比如連接用完了將其關掉),事實上__del__很少被使用,因為它的調用是非常不穩定的;請謹慎使用!

把他們合起來後,這裡就是一個 __init__ 和 __del__ 使用的例子:

from os.path import joinclass FileObject:
'''Wrapper for file objects to make sure the file gets closed on deletion.'''

def __init__(self, filepath='~', filename='sample.txt'):
# open a file filename in filepath in read and write mode
self.file = open(join(filepath, filename), 'r+')

def __del__(self):
self.file.close()
del self.file

Copyright © Linux教程網 All Rights Reserved