2. 類的定義
3. 類的成員
4. 魔法方法
5. 動態屬性操作
6. 物件導向與面向過程
對於物件而言,其具有屬性與行為。在我們進行描述的時候,屬性,多體現為名詞,而行為,多體現為動詞。
所謂的類,其實指的就是乙個類別,即具有相同屬性與行為的所有物件構成的乙個整體。相同類別的物件之間總會比不同類別的物件之間更加相似。
關於類與物件,我們可以這樣總結二者的關係:
類是物件的抽象,而物件是類的具體表現形式。
類是設計的藍圖(模板),而物件就是該藍圖設計出的具體產物。
以下給出具體說明。
我們通過class關鍵字來定義乙個類,格式如下:
class 類名:
類體
class
wwudi
(object):
//建立類名,第乙個字母必須大寫
def__init__
(self,***,buled)
://建立類的引數名
self.***=*** //設定引數型別
self.blued=buled
defmarry
(self)
://設定行動
a =input
("today is mon"
)return a
jhon = wwudi(
"aaa"
,"111"
)//傳遞值
print
(jhon)
print
(type
(jhon)
)print
(jhon.marry())
//呼叫類的定義
我們要設計一輛汽車,該汽車具有的功能,就會體現在設計圖紙中。當我們使用該圖紙建立出真正的汽車之後,該汽車自然也就具有設計圖紙中所表明的功能。
同樣,我們在類的內部定義屬性與方法(設計圖紙),當我們使用該類建立具體的物件時,該物件也就自然具有類中定義的屬性與方法。
除了在類中預先定義屬性與方法外,我們也可以動態的為物件增加屬性與方法。
動態為類增加屬性與方法
物件的行為,我們通過在類內定義方法來實現。所謂方法,其形式與函式非常相似,只不過是定義類的內部,關聯了某個物件而已。
乙個人的類別,具有走路與跑步兩種行為。
self
在兩個方法中,都具有乙個引數:self。該引數用來表示當前的物件。何為當前物件呢?指的就是呼叫該方法的時候,所使用的物件。簡單來說,就是誰呼叫了這個方法,當前物件就是誰。
我們知道,如果僅僅定義了類,而沒有為類具體化(建立物件),是不能夠使用類中定義的功能的,這就正如我們僅有汽車的設計圖紙,而沒有建立出具體的汽車,就不能夠開車出行一樣。因此,如果沒有建立物件,就不能夠呼叫walk與run方法。而當我們通過物件呼叫方法時,該物件就會隱式的傳遞給方法的第乙個引數(無需我們顯式傳遞)。
剛才我們在類中定義了方法,來表示物件的行為,但是,物件也是可以具有屬性的。例如,人可以具有姓名,年齡等屬性。
關於定義屬性,我們可以在__init__中進行定義。__init__方法是乙個特殊的方法,該方法會在建立物件時自動得到執行。並且,每建立乙個物件,該方法都會執行一次。
驗證__init__方法(建立時—是兩個——)
既然__init__方法具有在建立物件時自動執行的特徵,我們就可以在該方法中執行物件的初始化,定義屬性就是一件最常用的操作。而__init__方法具有初始化的能力,我們也習慣將其稱為構造器或構造方法。
我們在__init__方法中,定義了name與age兩個屬性。在建立物件時,就能夠自動呼叫該方法,為物件增加這兩個屬性。同時,我們也修改了walk與run兩個方法的實現,在方法中訪問name屬性,注意,name與age兩個屬性都是關聯當前self物件的,因此也必須要通過物件才能夠訪問這兩個屬性。
含有引數的__init__方法
上述的程式,成功在類中定義了屬性與方法,並且在建立物件時,也訪問了類中定義的屬性與方法。不過,這個程式有乙個不足,就是無論我們建立多少個物件,物件的屬性都是完全一致的。
為了能夠更加靈活的建立物件,讓物件具有不同的屬性值,我們可以在__init__方法中增加引數,然後在建立物件時,動態傳遞實際引數來初始化物件的屬性(不再使用固定值初始化),這樣就能夠避免建立屬性值完全相同的物件了。
通過__init__方法初始化。
之前我們定義的屬性,都是與類的物件相關聯的,這種屬性稱為例項屬性。對於物件,也稱為例項,例如,建立類的物件,也可以稱為,建立類的例項。
除了例項屬性外,我們也可以定義類屬性,所謂類屬性,就是與當前類進行關聯,不屬於物件。類屬性直接定義在類體中,例如:
class classname:
class_property = 1
這樣,就定義了乙個名稱為class_property的類屬性,其關聯繫結的值為1。
類屬性與例項屬性的區別在於:
靜態屬性的使用
屬性可以分為類屬性與例項屬性,同樣,方法也可以分為類方法與例項方法。類似的,例項方法與具體的類的某個物件想關聯,我們之前所接觸的方法,都是例項方法。我們可以使用@classmethod來修飾乙個方法,這樣的方法稱為類方法。例如:
class
classname
: @classmethod
defclass_method
(cls)
: 方法體
按照慣例(並非語法要求),我們將類方法的第乙個引數命名為cls(這類似於例項方法的第乙個引數self),該引數是有特殊意義的,用來表示當前類,即呼叫該類方法的那個類。在呼叫類方法時,cls無需我們顯式傳遞(就像例項方法的self無需我們顯式傳遞一樣)。
類方法與例項方法,二者既可以通過類名呼叫,也可以通過物件來呼叫。不過,就像通過物件訪問類屬性一樣,通過物件來呼叫類方法會造成不必要的混淆(類方法與類的物件無關,是繫結當前類的),因此,我們應該總是通過類名來呼叫類方法。
類方法與例項方法對屬性的訪問
在類方法中,需要通過引數(cls)訪問類屬性,而不能直接訪問類屬性。例項方法沒有cls引數,可以通過類名來訪問類屬性,但是,這是一種硬編碼的方式,如果以後類名發生了改變,則我們通過類名訪問類屬性的語句都需要進行修改。這不利於程式的維護。為了降低耦合性,我們在例項方法中,可以通過__class__來動態獲取當前物件所屬的類:
self.class# 相當於獲取到了cls,也就是self物件所屬的類(動態獲取)。
更簡單一些,如果是在類的內部,我們還可以省略物件的限定,直接使用:
_class_
然後,我們就可以這樣去訪問類屬性:
類的物件.class.類屬性
class.類屬性 # 必須在類的內部
這種訪問的優勢在於,以後就算類名發生了改變,訪問類屬性的語句也無需進行任何修改,利於程式的維護。
對屬性的訪問
除了類方法與例項方法外,類中還可以定義靜態方法。
靜態方法使用@staticmethod修飾,例如:
class
classname
: @staticmethod
defstatic_method()
: 方法體
與類方法不同,靜態方法沒有cls引數。對於靜態方法而言,其既與當前類的物件無關,也與當前類無關,可以說,靜態方法只是定義在類的內部,從邏輯結構上,與當前類劃分到了一起,從功能的角度講,我們完全可以將靜態方法遷移到類的外部,作為函式來實現同樣的功能。
不過,對於當前類來說,靜態方法還是有一定的意義的。如果某個函式,其實現的功能與某個類關係緊密,但是又不依賴於當前類(cls)與當前物件(self)時,我們就可以將該函式宣告在類的內部,作為靜態方法。靜態方法既可以通過類名呼叫,也可以通過物件呼叫,建議通過類名呼叫,因為靜態方法與物件無關。
靜態方法的使用。
我們在類中可以定義類屬性,類方法,靜態方法,也可以定義例項屬性與例項方法。可是,我們在設計乙個類的時候,該如何進行選擇呢?
在python語言中,定義了一些特殊的方法,這些方法通常不會顯式去呼叫,而是在特定的場合下隱式呼叫執行的。這些特殊的方法名稱都是以雙下劃線開頭,並且以雙下劃線結尾,我們將這些方法稱為魔法方法。
_new_(cls, ……)
建立cls類的物件。通過引數的cls可知,該方法是乙個類方法,但是不需要使用裝飾器來修飾(@classmethod),該方法的其他引數由構造器傳入。該方法中,通常會呼叫父類的__new__方法來建立物件,並返回。如果該方法返回值為當前類的物件,則會繼續呼叫初始化方法(init),傳入當前建立的物件,否則,初始化方法不會執行。
該方法通常不需要自行實現,當我們實現該方法時,主要用來完成自定義的物件建立。
python提供了如下的內建函式,用來操作物件的屬性。
如果使用obj.name的方式訪問屬性的話,name必須是編寫**時已知的內容,而不能通過字串來指定。以上函式的優勢在於,我們可以通過字串的形式來操作屬性,而無需在編寫**的時候就知道具體的屬性名稱。因此,這就給我們操作屬性帶來了一定的靈活性。我們完全可以在執行時以字串的形式傳遞屬性名,進行操作。
如今,我們進行的程式設計往往都是物件導向程式設計(oop,object-oriented programming)。在物件導向程式設計之前,還有一種程式設計方式,叫做面向過程程式設計。對於面向過程而言,體現的是一種流程設計,即按部就班的完成每乙個環節。為了實現每個環節的可復用性,環節都是通過呼叫乙個個函式來實現的。因此,在面向過程的程式設計中,通常都是定義大量的函式,按照需求順序依次進行呼叫。
而物件導向程式設計則不同,在物件導向中,會根據需求,劃分為若干個類,每個類會建立物件,以物件的方式來進行互動。所以,在物件導向中,我們的程式不再是以函式為單位,而是以物件為單位。
Python類和物件
1 建立類 語法 class classname 類的幫助資訊 類文件字串 class suite 類體 例如 class employee 所有員工的基類 empcount 0 def init self,name,salary self.name name self.salary salary ...
Python類和物件
python類和物件 類 具有相同的屬性和方法的物件的集合。物件 萬物皆物件。類和物件的關係 類是具有相同屬性方法物件的集合。類包含屬性和方法 語法 class 類名 屬性 方法定義乙個類 建立物件 屬性寫在類外的情況,就是通過物件,屬性,物件,方法的方式呼叫。屬性相對於類來說屬於全域性,每個方法都...
Python類和物件
類和物件 類 class 用來描述具有相同的屬性和方法的物件的集合。它定義了該集合中每個物件所共有的屬性和方法。物件是類 的例項。方法 類中定義的函式。類變數 類變數在整個例項化的物件中是公用的。類變數定義在類中且在函式體之外。類變數通常不作為例項變數使用。方法重寫 如果從父類繼承的方法不能滿足子類...