幫Python找「物件」

2021-07-26 23:35:07 字數 3702 閱讀 2122

引言:你一定會感嘆:python還缺找物件? 畢竟「一切皆物件」是人家python的哲學理念。不過,python 

允許程式設計師以純粹的面向過程的方式來使用它,所以人們有時會忽視它那顆「找物件」的心。其實無論是面向過程,還是函式式程式設計,都是特殊的物件模擬出的效果。 

本文選自《從python開始學程式設計》。讓我們通過幫python找物件,來學習python這一語言。

說是要「找物件」,我們第乙個看的卻是個叫作「類」的語法結構。這裡的類其實和我們日常生活中的「類」的概念差不多。日常生活中,我們把相近的東西歸為一類,而且給這個類起乙個名字。比如說,鳥類的共同屬性是有羽毛,通過產卵生育後代。任何乙隻特別的鳥都是建立在鳥類的原型基礎上的。 

下面我們用python 語言來記錄上面的想法,描述鳥類:

class

bird

(object):

feather = true

reproduction = "egg"

class

bird

(object):

feather = true

reproduction = "egg"

defchirp

(self, sound):

print(sound)

我們給鳥類新增乙個方法屬性,就是表示鳥叫的方法chirp()。方法chirp()看起來很像乙個函式。它的第乙個引數是self,是為了在方法內部引用物件自身,我將在後面詳細解釋。需要強調的是,無論該引數是否用到,方法的第乙個引數必須是用於指代物件自身的self。剩下的引數sound 是為了滿足我們的需求設計的,它代表了鳥叫的內容。方法chirp()會把sound 列印出來。

我們定義了類,但和函式定義一樣,這還只是打造兵器的過程。為了使用這個利器,我們需要深入到物件的層面。通過呼叫類,我們可以創造出這個類下面的乙個物件。比如說,我養了乙隻小雞,叫summer。它是個物件,且屬於鳥類。我們使用前面已經定義好的鳥類,產生這個物件:

summer =bird()

通過這一句建立物件,並說明summer 是屬於鳥類的乙個物件。現在,我們就可以使用鳥類中已經寫好的**了。作為物件的summer 將擁有鳥類的屬性和方法。對屬性的引用是通過物件.屬性(object.attribute)的形式實現的。比如說:

print(summer.reproduction) # 列印'egg'
用上面的方式,我們得到summer 所屬類的繁殖方式。 

此外,我們還可以呼叫方法,讓summer 執行鳥類允許的動作。比如:

summer.chirp("jijiji") # 列印'jijiji'
在呼叫方法時,我們只傳遞了乙個引數,也就是字串」jijiji」。這正是方法與函式有所區別的地方。儘管在定義類的方法時,我們必須加上這個self 引數,但self 只用能在類定義的內部,所以在呼叫方法時不需要對self 傳入資料。通過呼叫chirp()方法,我的summer 就可以叫了。 

到現在為止,描述物件的資料都儲存於類的屬性中。類屬性描述了乙個類的共性,比如鳥類都有羽毛。所有屬於該類的物件會共享這些屬性。比如說,summer 是鳥類的乙個物件,因此summer 也有羽毛。當然,我們可以通過某個物件來引用某個類屬性。 

對於乙個類下的全部個體來說,某些屬性可能存在個體差異。比如說,我的summer 是黃色的,但並非所有的鳥兒都是黃色的。再比如說人這個類。性別是某個人的乙個性質,不是所有的人類都是男,或者都是女。這個性質的值隨著物件的不同而不同。李雷是人類的乙個物件,性別是男。韓美美也是人類的乙個物件,性別是女。 

因此,為了完整描述個體,除了共性的類屬性外,我們還需要用於說明個性的物件屬性。在類中,我們可以通過self 來操作物件的屬性。現在我們拓展bird 類:

class

bird

(object):

defchirp

(self, sound):

print(sound)

defset_color

(self, color):

self.color = color

summer = bird()

summer.set_color("yellow")

print(summer.color) # 列印'yellow'

在方法set_color()中,我們通過self 引數設定了物件的屬性color。和類屬性一樣,我們能通過物件.屬性的方式來操作物件屬性。由於物件屬性依賴於self,所以我們必須在某個方法內部才能操作類屬性。因此,物件屬性沒辦法像類屬性一樣,在類下方直接賦初值。 

但python 還是提供了初始化物件屬性的辦法。python 定義了一系列特殊方法。特殊方法又被稱為魔法方法(magic method)。特殊方法的方法名很特別,前後有兩個下畫線,比如init()、add()、dict()等。程式設計師可以在類定義中設定特殊方法。python 會以特定的方式來處理各個特殊方法。對於類的init()方法,python 會在每次建立物件時自動呼叫。因此,我們可以在init()方法內部來初始化物件屬性:

class

bird

(object):

def__init__

(self, sound):

self.sound = sound

print("my sound is:", sound)

defchirp

(self):

print(self.sound)

summer = bird("ji")

summer.chirp() # 列印'ji'

在上面的類定義中,我們通過init()方法說明了這個類的初始化方式。每當物件建立時,比如建立summer 物件時,init()方法就會被呼叫。它會設定sound 這個物件屬性。在後面的chirp()方法中,就可以通過self 呼叫這一物件屬性。除了設定物件屬性外,我們還可以在init()中加入其他指令。這些指令會在建立物件時執行。在呼叫類時,類的後面可以跟乙個引數列表。這裡放入的資料將傳給init()的引數。通過init()方法,我們可以在建立物件時就初始化物件屬性。 

除了操作物件屬性外,self 引數還有另外乙個功能,就是能讓我們在乙個方法內部呼叫同一類的其他方法,比如:

class

bird

(object):

defchirp

(self, sound):

print(sound)

defchirp_repeat

(self, sound, n):

for i in range(n):

self.chirp(sound)

summer = bird()

summer.chirp_repeat("ji", 10) # 重複列印'ji'10 次

在方法chirp_repeat()中,我們通過self 呼叫了類中的另乙個方法chirp()。

本文選自《從python開始學程式設計》,點此鏈結可在博文視點官網檢視此書。

幫Python找「物件」

說是要 找物件 我們第乙個看的卻是個叫作 類 的語法結構。這裡的類其實和我們日常生活中的 類 的概念差不多。日常生活中,我們把相近的東西歸為一類,而且給這個類起乙個名字。比如說,鳥類的共同屬性是有羽毛,通過產卵生育後代。任何乙隻特別的鳥都是建立在鳥類的原型基礎上的。下面我們用python 語言來記錄...

找物件與操作物件

找 1.用id查詢,返回值是 物件 console.log document.getelementbyid test1 2.用標籤查詢,返回值是 物件的集合 即使只找到乙個物件也包裝成物件集合返回 console.log document.getelementsbytagname p length ...

Query Object 查詢物件模式 下

回顧 不管什麼樣的框架,使用起來不簡單不易用的話,那麼就沒有設計的必要了。基於表示式的實現 首先從簡單的呼叫方式開始吧,如 query add school s s.name 一中 或者 query add school s s.age 20 分析以上兩個查詢條件表示式,並且跟原先的criterio...