python 類和物件

2021-09-17 04:41:21 字數 4890 閱讀 3937

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 用來描述具有相同的屬性和方法的物件的集合。它定義了該集合中每個物件所共有的屬性和方法。物件是類 的例項。方法 類中定義的函式。類變數 類變數在整個例項化的物件中是公用的。類變數定義在類中且在函式體之外。類變數通常不作為例項變數使用。方法重寫 如果從父類繼承的方法不能滿足子類...