1. 程式人生 > >Python學習(6)——面向物件編輯

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)判斷基本資料型別可以直接寫intstr

(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)相同名稱的例項屬性將遮蔽掉類屬性,但是當刪除例項屬性後,再使用相同的名稱,訪問到的將是類屬性

 

https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014318645694388f1f10473d7f416e9291616be8367ab5000