python中的魔術方法__

發表於2016-06-06

1、__ new__, __ init__, __ call__

__ new__(cls, *args, **kwargs) 建立物件時呼叫,返回當前物件的一個例項;注意:這裡的第一個引數是cls即class本身
__ init__(self, *args, **kwargs) 建立完物件後呼叫,對當前物件的例項的一些初始化,無返回值,即在呼叫__new__之後,根據返回的例項初始化;注意,這裡的第一個引數是self即物件本身
__ call__(self, *args, **kwargs) 如果類實現了這個方法,相當於把這個型別的物件當作函式來使用,相當於 過載了括號運算子

繼承自object的新式類才有__ new__
__ new__至少要有一個引數cls,代表要例項化的類,此引數在例項化時由Python直譯器自動提供

__ new__必須要有返回值,返回例項化出來的例項,這點在自己實現_ new__時要特別注意,可以return父類__ new__出來的例項,或者直接是object的 _new__出來的例項

__ init__有一個引數self,就是這個 __ new__返回的例項,__ init__在__ new__的基礎上可以完成一些其它初始化的動作,__ init__不需要返回值

若_ _new__沒有正確返回當前類cls的例項,那__ init__是不會被呼叫的,即使是父類的例項也不行

http://www.cnblogs.com/ifantastic/p/3175735.html

通常來說,新式類開始例項化時,new()方法會返回cls(cls指代當前類)的例項,然後該類的init()方法作為構造方法會接收這個例項(即self)作為自己的第一個引數,然後依次傳入new()方法中接收的位置引數和命名引數。

注意:如果new()沒有返回cls(即當前類)的例項,那麼當前類的init()方法是不會被呼叫的。如果new()返回其他類(新式類或經典類均可)的例項,那麼只會呼叫被返回的那個類的構造方法。

2、__ del__
它不實現語句 del x (以上程式碼將不會翻譯為 x.__ del__() )。它定義的是當一個物件進行垃圾回收時候的行為。當一個物件在刪除的時需要更多的清潔工作的時候此方法會很有用,比如套接字物件或者是檔案物件。注意,如果直譯器退出的時候物件還存存在,就不能保證 __ del__ 能夠被執行

3、用於比較的魔術方法

http://pycoders-weekly-chinese.readthedocs.org/en/latest/issue6/a-guid…

相關文章