Python 基礎之物件導向

2021-08-10 21:04:14 字數 2943 閱讀 4835

封裝繼承

類和型別

多型意味著就算不知道變數所引用的物件型別是什麼,還是能對它進行操作,而它也會根據物件(或者類)型別的不同而表現出不同的行為。

程式得到了乙個物件,但是並不知道它是怎麼實現的——它可能有多種「形狀」。

繫結到物件特性上面的函式稱為方法(method)。

對於乙個變數x來說,我們不需要知道他是字串還是列表,就可以呼叫它的count方法——不用管它是什麼型別(前提是你提供了乙個字元作為引數)。

from random import choice

x=choice(['hello,world!',[1,2,'e','e',3]]) #random 中的 choice函式,可以從序列中隨機的選出元素給變數賦值

print(x.count('e'))

對於上述**只需要知道x有個叫做count的方法,帶有乙個字元作為引數,並且返回整數值就夠了。

任何不知道物件是什麼型別,但是又必須為物件實現某種功能的時候,都會用到多型。

例如:

def

add(x,y):

return x+y

a=1b=2

print(add(a,b))

a='hello '

b='world!'

print(add(a,b))

很多函式和運算子都是多型的——至少你寫的大部分程式可能都是,即使你不是有意這樣。

封裝是對全域性作用域中其他區域隱藏多餘資訊的原則。聽著有點像多型——適用物件而不知內部細節。兩者概念類似,二者都會幫助處理程式元件而不用過多關注多餘細節。

封裝並不等同於多型多型。多型可以讓使用者對於不知道是什麼類的物件進行方法呼叫,而封裝是不用關心物件是如何構建的而直接使用。

繼承是另外一種懶惰行為。作為乙個苦逼的程式設計師自然不想把同一段**寫好幾次。顯然可以使用函式來解決。但是倘若現在已經有了乙個類,而現在又想建立乙個類似的新的類

新的類可能保留了原本的類的大多數方法,可能只需要擴充套件幾個新的方法。在編寫新類的時候又不想把舊類的方法全部拷貝過去,那麼這個時候就是繼承出場的時候了。

可以將類或多或少的視為種類或者型別的同義詞。從很多方面來說,這就是類——一種物件。所有的物件都屬於乙個類,稱為類的例項(instance)。

例如:阿爾托利亞·潘德拉貢 屬於「servant」類的例項。但是「servant」類是有很多子類諸如「saber」、「archer」、「rider」等類的一般(抽象)類。並且吾王(阿爾托利亞·潘德拉貢)本身也屬於「saber」類。這個時候「saber」類就是「servant」類的子類。反過來說「servant」類是「saber」類的父類也稱超類。

在物件導向的程式設計中,子類的關係是隱式的,乙個類的定義取決它所支援的方法。所有類的例項都會包括這些方法。子類也會繼承父類的方法。

class + 類名() + 「:」

class

person

(object):

defsetname

(self,name):

self.name = name

defgetname

(self):

return self.name

defgreet

(self):

print("hello world!i'm %s." % self.name)

foo=person()

bar=person()

foo.setname("asunna")

bar.setname('saber')

foo.greet()

bar.greet()

#結果:

# hello world!i'm asunna.

# hello world!i'm saber.

self表示對自身物件的引用。在呼叫foo的setname方法時,foo自動的將自己作為第一引數傳入函式中——因此形象的命名為self。

將其他類名寫在class語句後的圓括號內就表示可以繼承父類

class

filter

(object):

definit

(self):

self.blocked =

deffilter

(self, sequence):

return [x for x in sequence if x not

in self.blocked]

class

spamfilter

(filter):

definit

(self):

#重寫父類中的init方法

self.blocked=["spam"]

f=filter()

f.init()

print(f.filter([1,2,3]))

s=spamfilter()

s.init()

print(s.filter(["spam","spam","spam",'spam',"aspm"]))

#result:

# [1, 2, 3]

# ['spam', 'spam', 'aspm']

子類可以繼承多個父類,方法如下:

class

cal(object):

pass

class

tal(object):

pass

class

tc(cal,tal):

pass

在使用多重繼承時,有個需要注意的地方。如果乙個方法從多個超類中繼承(換句話說你有兩個具有相同名字的不同方法),那麼必須要注意一下超類的順序:先繼承的類中方法會重寫後繼承的類中的方法。

如果父類們共享乙個父類,那麼在查詢給定方法或者特性的時訪問的父類順序稱為mro(method resolution order,方法判定順序)。

Python之物件導向 物件導向基礎

一 面向過程 物件導向對比 1 面向過程 根據業務邏輯從上到下寫壘 2 函式式思想 將某功能 封裝到函式中,日後便無需重複編寫,僅呼叫函式即可 3 物件導向 對函式進行分類和封裝 1 2 3一步一步抽象,函式式是走向物件導向的中間步驟 函式式的應用場景 各個函式之間是獨立且無共用的資料 物件導向程式...

Python 基礎之物件導向

python 是乙個高層次的結合了解釋性 編譯性 互動性和物件導向的指令碼語言。python 的設計具有很強的可讀性,相比其他語言經常使用英文關鍵字,其他語言的一些標點符號,它具有比其他語言更有特色語法結構。python 是一種解釋型語言 這意味著開發過程中沒有了編譯這個環節。類似於php和perl...

python基礎之物件導向案例

class person def init self,name,wight self.屬性 形參 self.name name self.wight wight def str self return 我的名字叫 s 體重是 2f公斤 self.name,self.wight def run sel...