1. 程式人生 > 實用技巧 >關於python中魔術方法和getter與setter的簡記

關於python中魔術方法和getter與setter的簡記

python中一切皆物件,即我們定義的類本身也是物件

   那麼要注意每個類中可以寫一些通用的方法,而且一般對外不可訪問,即識別符號首尾都有雙下劃線(沒錯__init__就是魔術方法之一),這些方法涉及到一些所有類可能都需要的屬性,比如__len__可以返回長度,__repr__()直接返回呼叫這個物件的返回值,(感覺類似c++中的函式物件的處理)。還有__new__()等在init之前建立物件時最先呼叫的方法,在物件使用結束之後還有一個__del__方法來解除記憶體的引用標記(理解為刪除對應內容,當不再使用時)

   這些魔法函式甚至可以過載運算子還有定義類之間的運算,自由度很高,而且可以自己處理健壯性的問題。

   詳細的使用方法與作用見引用的網頁:https://www.bbsmax.com/A/obzb3GYQJE/

以下是對類中getter與setter的使用和說明(jupyter notebook):

 1 %config ZMQInteractiveShell.ast_node_interactivity='all'
 2 #@property—把函式呼叫偽裝成對屬性的訪問,資料描述符屬性的優先順序高於例項名稱空間中的同名成員。
 3 # 使用@property,不用再像java中使用getter,setter方法去設定和訪問類變數   
 4 # 這時,也只有通過@property,才能對例項變數進行訪問或設定,實現了對變數訪問的控制,
5 6 class Student1(): 7 def __init__(self,name,age): ###__init__例項初始化 8 self.name = name ####self:例項變數,變數的名字叫name 9 self.__age=age 10 11 @property #getter 12 def name1(self): 13 return self.name 14 15 @name1.setter # setter 16 def name1(self,newname):
17 self.name = newname 18 19 @property #getter 20 def age(self): 21 return 0 22 23 @age.setter # setter 24 def age(self,newage): 25 self.__age = newage 26 27 # 上面這樣設定的是類變數可以被類例項隨意訪問,修改。 28 # 注意,這裡的name1,如果和例項變數name重名會導致,無限遞迴!!! 29 # RecursionError: maximum recursion depth exceeded while calling a Python object 30 31 # 但如果想讓@property和類例項變數同名呢? 32 # 將例項變數設定為私有(像age一樣)就不會導致重名引發遞迴宕機了 33 s1=Student1('jack',33) 34 s1.name1 35 36 s1.age#getter 37 s1.age=22#setter 38 39 s1.age