在本講座中,我們將學習 Python 中的類、構造函數和繼承。
這些概念在需要定義不同類型的大型程序中非常重要。
課程
類在編程中是必不可少的,它們並不特定於 python。 很多別的 編程語言 支持類的概念。 我們使用類來定義新的數據類型。
到目前為止,我們已經了解了 Python 中的基本數據類型,如數字、字符串和布爾值。 這些是 Python 中的基本或簡單數據類型。 我們還看到了一些複雜的數據類型,例如列表和字典。
雖然這些類型非常有用,但它們並不總是用於對複雜概念建模。 例如,考慮點或購物車的想法。 購物車不是布爾值或列表。 這是一種不同的數據。 所以我們可以使用類來定義新的類型來模擬真實的概念。
現在,讓我們定義一個新的數據類型,稱為點。 這種新類型將具有我們之前檢查過的方法。
這是你將如何做的:
我們首先使用“class”關鍵字定義一個類,然後立即為我們的類命名。
class Point
現在,看看我在這裡使用的命名約定。 我在這裡將第一個字母大寫,這就是我們所說的 Pascal 命名約定。 此約定不同於我們用於命名變量和函數的約定,我們總是使用小寫字母並使用下劃線分隔多個單詞。 但是在命名類的時候,我們不使用下劃線來分隔多個單詞,而是將每個單詞的首字母大寫。
在定義了我們的類之後,使用了一個冒號,這意味著現在定義了一個塊。
class Point:
def move (self):
在這個塊中,我們可以定義所有屬於點的函數或方法。 例如,我們可以定義一個名為“move”的函數來移動一個點。 請注意,只要我們鍵入左括號,PyCharm 就會自動在此處添加“self”。 這是一個特殊的關鍵字,讓我稍後再談。 讓我們在終端上打印“move”。
print("move")
讓我們定義另一種方法,如“draw”並將其打印在終端上。
def draw(self):
print("draw")
我們完成了“點”類的定義。 使用這種新類型,我們可以創建新對象。 一個類只是定義藍圖或模板來創建對象,這些對像是基於該藍圖的實際實例。 要創建一個對象,我們輸入類的名稱,然後像調用函數一樣調用它。 這將創建一個新對象,然後將其返回。 然後我們可以將該對象存儲在一個變量中。 我來給你展示:
這裡我們定義了一個“point1”,它是一個三維點。 你可以看到,我們可以在終端上打印個人坐標。
有了這個點,我們就可以使用“繪製”和“移動”兩種方法。
因此,回顧一下,我們使用類來定義新類型,這些類型可以具有我們在類主體中定義的方法。 類可以具有我們可以在程序中的任何位置設置的屬性。
建設者
到目前為止,我們已經學習瞭如何使用類創建新類型。 現在這個實現有一個小問題。 我們可以使用類創建沒有 x 或 y 坐標的點對象,但這並不理想。 我來給你展示。
讓我們在設置 x 坐標之前創建一個點並打印它。 運行我們的程序會導致如下屬性錯誤:
這意味著點對像沒有名為 x 的屬性。 現在的問題是可能有一個沒有 x 或 y 坐標的點對象。 這是沒有意義的,因為無論何時我們談論一個點,我們都需要知道該點位於何處。 為了解決這個問題,我們使用構造函數。 構造函數是在創建對象時調用的函數。
下面是我們如何使用構造函數。 首先,讓我們在上面的程序中傳遞 x 和 y 坐標值。
point = Point(10, 20)
print(point.x)
現在,我們需要在這個類中添加一個稱為構造函數的特殊方法。 它的語法是這樣的:
def __init__(self, x, y):
init
是 initialized 的縮寫,這是在創建新點對象時調用的函數或方法。 x 和 y 緊隨其後 self
添加兩個額外的參數。
之後,我們應該將 x 和 y 映射到傳遞的值,即 10 和 20
self.x = x
self.y = y
我們使用 self
引用當前對象,然後我們將 x 屬性設置為傳遞給函數“x”的 x 參數。 這樣,使用 init
方法,我們可以初始化我們的對象。 此方法稱為構造函數。 讓我們運行我們的程序。
現在,我們可以稍後更改 x 和 y 坐標。 讓我們更新 x 坐標:
point = Point(10, 20)
point.x = 11
print(point.x)
現在,x 坐標更新為值 11。
行使
這是給你的一個有趣的練習。
我希望你定義一個新類型,叫做人。 這些“人”對象應該有一個“name
”屬性以及“talk()
“ 方法。
這是一項簡單的任務,不會超過幾分鐘。
解決方案
從像這樣定義類“Person”開始:
class Person:
self.name = name
我們稍後會定義構造函數。 現在,我們可以創建“Person”對象。 我們就叫它約翰吧
john = Person("John Smith")
print(john.name)
john.talk()
現在,繼續代碼的第一部分並創建一個構造函數。
def __init__(self, name):
最終代碼如下所示:
您還可以將格式化字符串和其他概念與類和構造函數結合使用。
遺產
繼承是與類相關的另一個概念,可以讓您重用代碼。
考慮這段代碼。
class Dog:
def walk(self):
print("walk")
我們創建了一個帶有“walk”方法的“Dog”類。 在這個方法中,我們只是在終端上打印步行消息。 比方說,在一個真實的程序中,有 10 行代碼,而不是這裡只有一行。 將來,如果需要另一個類具有“walk”方法,我們將不得不重複所有這些代碼。 這並不理想。
在編程中,我們有一個原則叫做 DRY,它是 don't repeat yourself 的縮寫。 假設將來某個時候,我們發現我們的“walk”方法有問題,如果我們在許多其他地方重複或複制了這個方法,我們將不得不回來並在我們複製的每個地方修復這個問題代碼。 所以這就是為什麼在編程中我們不應該定義兩次的原因。
有不同的方法來解決這個問題,但在這裡我們將學習一種對初學者來說更容易的方法,它被稱為繼承。 在這種情況下,我們將創建另一個類“哺乳動物”並在該類中定義我們的“行走”屬性。
class Mammal:
def walk(self):
print("walk")
在定義了我們的“哺乳動物”類之後,我們可以使用繼承來傳遞這樣的屬性:
dog 和 cat 類都繼承了其父類中定義的所有類方法。 現在,我們可以像這樣添加特定於狗的方法:
class Dog:
def bark(self):
print("bark")
包起來!
這都是關於類、構造函數和在具有繼承概念的類中重用代碼的。 現在我們的系列接近尾聲。 至此,您應該能夠在 Python 中生成良好、可讀且簡潔的代碼。
我們將在下一講中看到模塊和包的概念。
發表評論