程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

Python魔法方法(2):__init __(cls[,*args]) 方法

編輯:Python

Python 的對象天生擁有一些神奇的方法,它們總被雙下劃線所包圍,它們是面向對象的 Python 的一切。它們是可以給你的類增加魔力的特殊方法,如果你的對象實現(重載)了某一個魔法方法,那麼這個方法就會在特殊的情況下自動被 Python 所調用。

功能

初始化實例對象。


參數

self 表示對象本身,也可以有其他參數。

返回值

不需要返回值。


應用場景

當想要對象在創建時就初始化某些屬性。

使用示例

class MyText(object):
name = None
age = 18
hobby = None
def __init__(self, name, age, hobby):
self.name = name
self.age = age
self.hobby = hobby
sample = MyText('阿強', '20', '阿珍')
print(sample.__dict__)

__init__ 方法也叫構造器,它是實例化對象時自動調用的第二個方法。若沒有定義該方法,則實例化對象時就會自動調用其父類的 __init__ 方法。

所有類的超類 object,有一個默認包含 pass 的 __ init __() 實現,這個函數會在對象初始化的時候調用,我們可以選擇實現,也可以選擇不實現,一般建議是實現的,不實現對象屬性就不會被初始化。

__init__()  方法可以包含多個參數,但必須包含一個名為 self 的參數,且必須作為第一個參數。也就是說,類的構造方法最少也要有一個 self 參數,僅包含 self 參數的 __init__() 構造方法,又稱為類的默認構造方法。

在 __init__() 構造方法中,除了 self 參數外,還可以自定義一些參數,參數之間使用逗號“,”進行分割。

__init__ 和 __new__ 的區別

共同:

二者均是Python面向對象語言中的函數,__new__比較少用,__init__則用的比較多。

異同:

  • __new__是在實例創建之前被調用的,因為它的任務就是創建實例然後返回該實例對象,是個靜態方法。
  • __init__是當實例對象創建完成後被調用的,然後設置對象屬性的一些初始值,通常用在初始化一個類實例的時候。是一個實例方法。
  • __new__先被調用,__init__後被調用,__new__的返回值(實例)將傳遞給__init__方法的第一個參數,然後__init__給這個實例設置一些參數。

 補充說明:

1、繼承自object的新式類才有__new__

2、__new__至少要有一個參數cls,代表當前類,此參數在實例化時由Python解釋器自動識別

3、__new__必須要有返回值,返回實例化出來的實例,這點在自己實現__new__時要特別注意,可以return父類(通過super(當前類名, cls))__new__出來的實例,或者直接是object的__new__出來的實例

4、__init__有一個參數self,就是這個__new__返回的實例,__init__在__new__的基礎上可以完成一些其它初始化的動作,__init__不需要返回值

5、如果__new__創建的是當前類的實例,會自動調用__init__函數,通過return語句裡面調用的__new__函數的第一個參數是 cls 來保證是當前類實例,如果是其他類的類名,;那麼實際創建返回的就是其他類的實例,其實就不會調用當前類的__init__函數,也不會調用其他類的__init__函數。

6、在定義子類時沒有重新定義__new__()時,Python默認是調用該類的直接父類的__new__()方法來構造該類的實例,如果該類的父類也沒有重寫__new__(),那麼將一直按此規矩追溯至object的__new__()方法,因為object是所有新式類的基類。

7、而如果子類中重寫了__new__()方法,那麼你可以自由選擇任意一個的其他的新式類(必定要是新式類,只有新式類必定都有__new__(),因為所有新式類都是object的後代,而經典類則沒有__new__()方法)的__new__()方法來制造實例,包括這個新式類的所有前代類和後代類,只要它們不會造成遞歸死循環。反正肯定不能調用自己的__new__,這肯定是死循環。

8、對於子類的__init__,其調用規則跟__new__是一致的,當然如果子類和父類的__init__函數都想調用,可以在子類的__init__函數中加入對父類__init__函數的調用。

9、我們在使用時,盡量使用__init__函數,不要去自定義__new__函數,因為這兩者在繼承派生時的特性還是很不一樣的。

10、將類比作制造商,__new__方法就是前期的原材料購買環節,__init__方法就是在有原材料的基礎上,加工,初始化商品環節


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved