Python學習(6)——面向物件編輯
1、類和例項
(1)通過定義一個特殊的__init__
方法,在建立例項的時候,就把相關屬性綁上去
(2)普通的函式相比,在類中定義的函式第一個引數永遠是例項變數self
,並且,呼叫時,不用傳遞該引數
(3)和靜態語言不同,Python允許對例項變數繫結任何資料,也就是說,對於兩個例項變數,雖然它們都是同一個類的不同例項,但擁有的變數名稱都可能不同
2、訪問限制
(1)讓內部屬性不被外部訪問,可以把屬性的名稱前加上兩個下劃線__
。在Python中,例項的變數名如果以__
開頭,就變成了一個私有變數,只有內部可以訪問,外部不能訪問
(2)在Python中,變數名類似__xxx__
(3)有些時候,你會看到以一個下劃線開頭的例項變數名,比如_name
,這樣的例項變數外部是可以訪問的,但是,按照約定俗成的規定,當你看到這樣的變數時,意思就是,“雖然我可以被訪問,但是,請把我視為私有變數,不要隨意訪問”
(4)雙下劃線開頭的例項變數是不是一定不能從外部訪問呢?其實也不是。不能直接訪問__name
是因為Python直譯器對外把__name
變數改成了_Student__name
,所以,仍然可以通過_Student__name
來訪問__name
變數。但是強烈建議你不要這麼幹,因為不同版本的Python直譯器可能會把__name
3、獲取物件資訊
(1)判斷物件型別使用type()
函式,返回對應的Class型別
(2)判斷基本資料型別可以直接寫int
,str
等
(3)判斷一個物件是否是函式可以使用types
模組中定義的常量:types.FunctionType,types.BuiltinFunctionType,types.LambdaType,types.GeneratorType
(4)isinstance()
就可以告訴我們一個物件是否是某種型別(總是優先使用isinstance()判斷型別,可以將指定型別及其子類“一網打盡”)
(5)能用type()
判斷的基本型別也可以用isinstance()
(6)還可以判斷一個變數是否是某些型別中的一種,比如可以判斷是否是list或者tuple,isinstance([1, 2, 3], (list, tuple))
(7)要獲得一個物件的所有屬性和方法,可以使用dir()
函式,它返回一個包含字串的list
在Python中,如果你呼叫len()
函式試圖獲取一個物件的長度,實際上,在len()
函式內部,它自動去呼叫該物件的__len__()
方法。我們自己寫的類,如果也想用len(myObj)
的話,就自己寫一個__len__()
方法
(8)配合getattr()
、setattr()
以及hasattr()
,我們可以直接操作一個物件的狀態
(9)試圖獲取不存在的屬性,會丟擲AttributeError的錯誤
(10)可以傳入一個default引數,如果屬性不存在,就返回預設值:getattr(obj, 'z', 404)
4、例項屬性和類屬性
(1)可以直接在class中定義屬性,這種屬性是類屬性,歸類所有,但類的所有例項都可以訪問到
(2)相同名稱的例項屬性將遮蔽掉類屬性,但是當刪除例項屬性後,再使用相同的名稱,訪問到的將是類屬性