Datawhale python學習筆記十

2021-10-08 21:42:42 字數 3848 閱讀 8251

今天學習類與物件、魔法方法

(以下內容由datawhale溫情提供)

物件是類的例項。換句話說,類主要定義物件的結構,然後我們以類為模板建立物件。類不但包含方法定義,而且還包含所有例項共享的資料。

我們可以使用關鍵字class定義 python 類,關鍵字後面緊跟類的名稱、分號和類的實現。

python 的self相當於 c++ 的this指標。

類的方法與普通的函式只有乙個特別的區別 —— 它們必須有乙個額外的第乙個引數名稱(對應於該例項,即該物件本身),按照慣例它的名稱是self。在呼叫方法時,我們無需明確提供與引數self相對應的引數。

據說,python 的物件天生擁有一些神奇的方法,它們是物件導向的 python 的一切。

它們是可以給你的類增加魔力的特殊方法…

如果你的物件實現了這些方法中的某乙個,那麼這個方法就會在特殊的情況下被 python 所呼叫,而這一切都是自動發生的…

類有乙個名為__init__(self[, param1, param2...])的魔法方法,該方法在類例項化時會自動呼叫。

在 python 中定義私有變數只需要在變數名或函式名前加上「__」兩個下劃線,那麼這個函式或變數就會為私有的了。

baseclassname(示例中的基類名)必須與派生類定義在乙個作用域內。除了類,還可以用表示式,基類定義在另乙個模組中時這一點非常有用:

注意:如果上面的程式去掉:people.__init__(self, n, a, w),則輸出:說: 我 0 歲了,我在讀 3 年級,因為子類的構造方法把父類的構造方法覆蓋了。

解決該問題可用以下兩種方式:

python 雖然支援多繼承的形式,但我們一般不使用多繼承,因為容易引起混亂。

需要注意圓括號中父類的順序,若是父類中有相同的方法名,而在子類使用時未指定,python 從左至右搜尋,即方法在子類中未找到時,從左到右查詢父類中是否包含方法。

【例子】

class

turtle

:def

__init__

(self, x)

: self.num = x

class

fish

:def

__init__

(self, x)

: self.num = x

class

pool

:def

__init__

(self, x, y)

: self.turtle = turtle(x)

self.fish = fish(y)

defprint_num

(self)

:print

("水池裡面有烏龜%s只,小魚%s條"

%(self.turtle.num, self.fish.num)

)p = pool(2,

3)p.print_num(

)# 水池裡面有烏龜2只,小魚3條

類物件:建立乙個類,其實也是乙個物件也在記憶體開闢了一塊空間,稱為類物件,類物件只有乙個。

例項物件:就是通過例項化類建立的物件,稱為例項物件,例項物件可以有多個。

類屬性:類裡面方法外面定義的變數稱為類屬性。類屬性所屬於類物件並且多個例項物件之間共享同乙個類屬性,說白了就是類屬性所有的通過該類例項化的物件都能共享。

例項屬性:例項屬性和具體的某個例項物件有關係,並且乙個例項物件和另外乙個例項物件是不共享屬性的,說白了例項屬性只能在自己的物件裡面使用,其他的物件不能直接使用,因為self是誰呼叫,它的值就屬於該物件。

類屬性和例項屬性區別

注意:屬性與方法名相同,屬性會覆蓋方法。

python 嚴格要求方法需要有例項才能被呼叫,這種限制其實就是 python 所謂的繫結概念。

python 物件的資料屬性通常儲存在名為.__ dict__的字典中,我們可以直接訪問__dict__,或利用 python 的內建函式vars()獲取.__ dict__

魔法方法總是被雙下劃線包圍,例如__init__

魔法方法是物件導向的 python 的一切,如果你不知道魔法方法,說明你還沒能意識到物件導向的 python 的強大。

魔法方法的「魔力」體現在它們總能夠在適當的時候被自動呼叫。

魔法方法的第乙個引數應為cls(類方法) 或者self(例項方法)。

__init__(self[, ...])

__new__(cls[, ...])

__del__(self)

析構器,當乙個物件將要被系統**之時呼叫的方法。

__repr__(self):

__str__(self)的返回結果可讀性強。也就是說,__str__的意義是得到便於人們閱讀的資訊,就像下面的 『2019-10-11』 一樣。

__repr__(self)的返回結果應更準確。怎麼說,__repr__存在的目的在於除錯,便於開發者使用。

型別工廠函式,指的是不通過類而是通過函式來建立物件。

反運算魔方方法,與算術運算子保持一一對應,不同之處就是反運算的魔法方法多了乙個「r」。當檔案左操作不支援相應的操作時被呼叫。

a + b

這裡加數是a,被加數是b,因此是a主動,反運算就是如果a物件的__add__()方法沒有實現或者不支援相應的操作,那麼 python 就會呼叫b__radd__()方法。

__getattr____getattribute____setattr____delattr__

__getattr__(self, name): 定義當使用者試圖獲取乙個不存在的屬性時的行為。

__getattribute__(self, name):定義當該類的屬性被訪問時的行為(先呼叫該方法,檢視是否存在該屬性,若不存在,接著去呼叫__getattr__)。

__setattr__(self, name, value):定義當乙個屬性被設定時的行為。

__delattr__(self, name):定義當乙個屬性被刪除時的行為。

描述符就是將某種特殊型別的類的例項指派給另乙個類的屬性。

協議(protocols)與其它程式語言中的介面很相似,它規定你哪些方法必須要定義。然而,在 python 中的協議就顯得不那麼正式。事實上,在 python 中,協議更像是一種指南。

容器型別的協議

【例子】編寫乙個可改變的自定義列表,要求記錄列表中每個元素被訪問的次數。

把乙個類作為乙個迭代器使用需要在類中實現兩個魔法方法__iter__()__next__()

10. 生成器

Datawhale Python基礎 打卡Day1

如果安裝後無法正常使用,linux環境下可以嘗試執行一下source bashrc命令,windows下檢查系統環境變數。b 直譯器 推薦使用py3 的版本,前段時間看到新聞說python2到20年就停止更新了,不過可以建立虛擬環境,不用太過糾結。一直以為直譯器和編譯器是一回兒事,查了以後發現還是有...

DataWhale python基礎任務2打卡

import numpy as np list1 1,2,3 print 建立列表 print list1 list1 print 在列表末尾新增新的物件 print list1 list1 print pop 函式用於移除列表中的乙個元素 預設最後乙個元素 並且返回該元素的值。print pop ...

DataWhale python基礎任務3打卡

任務三 時長 2天 dict字典 a.定義 b.建立 c.字典的方法 集合a 特性 b 建立 c.方法 判斷語句 要求掌握多條件判斷 三目表示式 迴圈語句 dict字典 a.定義 b.建立 c.字典的方法 a b.字典可用來儲存任意型別的物件,其由鍵 key 和對應值 value 成對組成。字典也被...