elasticsearch入門系列">elasticsearch入門系列
623
2022-05-30
一、特殊成員和魔法方法
Python 中有大量類似__init__這種以雙下劃線開頭和結尾的特殊成員及“魔法方法”,
它們有著非常重要的地位和作用,也是 Python 語言獨具特色的語法之一!
比如:
__init__ : 構造函數,在生成對象時調用 __del__ : 析構函數,釋放對象時使用 __repr__ : 打印,轉換 __setitem__ : 按照索引賦值 __getitem__: 按照索引獲取值 __len__: 獲得長度 __cmp__: 比較運算 __call__: 調用 __add__: 加運算 __sub__: 減運算 __mul__: 乘運算 __div__: 除運算 __mod__: 求余運算 __pow__: 冪
需要注意的是,這些成員里面有些是方法,調用時要加括號,有些是屬性,調用時不需要加括號。下面介紹幾個常用的:
1. __doc__
說明性文檔和信息。Python 自建,無需自定義。
class Foo: """ 描述類信息,可被自動收集 """ def func(self): pass # 打印類的說明文檔 print(Foo.__doc__)
2. __init__()
實例化方法,通過類創建實例時,自動觸發執行。
class Foo: def __init__(self, name): self.name = name self.age = 18 obj = Foo('jack') # 自動執行類中的 __init__ 方法
3. __module__ 和 __class__
__module__ 表示當前操作的對象在屬于哪個模塊。
__class__ 表示當前操作的對象屬于哪個類。
這兩者也是 Python 內建,無需自定義。
class Foo: pass obj = Foo() print(obj.__module__) print(obj.__class__) ------------ 運行結果: __main__
4. __del__()
析構方法,當對象在內存中被釋放時,自動觸發此方法。
注:此方法一般無須自定義,因為 Python 自帶內存分配和釋放機制,除非你需要在釋放的時候指定做一些動作。析構函數的調用是由解釋器在進行垃圾回收時自動觸發執行的。
class Foo: def __del__(self): print("我被回收了!") obj = Foo() del obj
5. __dict__
列出類或對象中的所有成員!非常重要和有用的一個屬性,Python 自建,無需用戶自己定義。
class Province: country = 'China' def __init__(self, name, count): self.name = name self.count = count def func(self, *args, **kwargs): print('func') # 獲取類的成員 print(Province.__dict__) # 獲取 對象 obj1 的成員 obj1 = Province('HeBei',10000) print(obj1.__dict__) # 獲取 對象 obj2 的成員 obj2 = Province('HeNan', 3888) print(obj2.__dict__)
6. __str__()
如果一個類中定義了__str__()方法,那么在打印對象時,默認輸出該方法的返回值。這也是一個非常重要的方法,需要用戶自己定義。
下面的類,沒有定義__str__()方法,打印結果是:
class Foo: pass obj = Foo() print(obj)
定義了__str__()方法后,打印結果是:‘jack’。
class Foo: def __str__(self): return 'jack' obj = Foo() print(obj)
7、__len__()
在 Python 中,如果你調用內置的 len()函數試圖獲取一個對象的長度,在后臺,其實是去調用該對象的__len__()方法,所以,下面的代碼是等價的:
>>> len('ABC') 3 >>> 'ABC'.__len__() 3
Python 的 list、dict、str 等內置數據類型都實現了該方法,但是你自定義的類要實現len 方法需要好好設計。
Python 的特殊成員和“魔法方法”還有很多,需要大家在平時使用和學習的過程中不斷積累和總結使用經驗。
5G教育 Python 面向對象編程
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。