python3類和例項

2022-05-25 09:12:17 字數 3735 閱讀 1652

物件導向最重要的概念就是類(class)和例項(instance),必須牢記類是抽象的模板,比如student類,而例項是根據類建立出來的乙個個具體的「物件」,每個物件都擁有相同的方法,但各自的資料可能不同。

仍以student類為例,在python中,定義類是通過class關鍵字:

class student(object):

pass

class後面緊接著是類名,即student,類名通常是大寫開頭的單詞,緊接著是(object),表示該類是從哪個類繼承下來的,繼承的概念我們後面再講,通常,如果沒有合適的繼承類,就使用object類,這是所有類最終都會繼承的類。

定義好了student類,就可以根據student類建立出student的例項,建立例項是通過類名+()實現的:

>>> bart = student()

>>> bart

<__main__.student object at 0x10a67a590>

>>> student

可以看到,變數bart指向的就是乙個student的例項,後面的0x10a67a590是記憶體位址,每個object的位址都不一樣,而student本身則是乙個類。

可以自由地給乙個例項變數繫結屬性,比如,給例項bart繫結乙個name屬性:

>>> bart.name = 'bart simpson'

>>> bart.name

'bart simpson'

由於類可以起到模板的作用,因此,可以在建立例項的時候,把一些我們認為必須繫結的屬性強制填寫進去。通過定義乙個特殊的__init__方法,在建立例項的時候,就把namescore等屬性綁上去:

class student(object):

def __init__(self, name, score):

self.name = name

self.score = score

注意:特殊方法「__init__」前後分別有兩個下劃線!!!

注意到__init__方法的第乙個引數永遠是self,表示建立的例項本身,因此,在__init__方法內部,就可以把各種屬性繫結到self,因為self就指向建立的例項本身。

有了__init__方法,在建立例項的時候,就不能傳入空的引數了,必須傳入與__init__方法匹配的引數,但self不需要傳,python直譯器自己會把例項變數傳進去:

>>> bart = student('bart simpson', 59)

>>> bart.name

'bart simpson'

>>> bart.score

59

和普通的函式相比,在類中定義的函式只有一點不同,就是第乙個引數永遠是例項變數self,並且,呼叫時,不用傳遞該引數。除此之外,類的方法和普通函式沒有什麼區別,所以,你仍然可以用預設引數、可變引數、關鍵字引數和命名關鍵字引數。

物件導向程式設計的乙個重要特點就是資料封裝。在上面的student類中,每個例項就擁有各自的namescore這些資料。我們可以通過函式來訪問這些資料,比如列印乙個學生的成績:

>>> def print_score(std):

... print('%s: %s' % (std.name, std.score))

...>>> print_score(bart)

bart simpson: 59

但是,既然student例項本身就擁有這些資料,要訪問這些資料,就沒有必要從外面的函式去訪問,可以直接在student類的內部定義訪問資料的函式,這樣,就把「資料」給封裝起來了。這些封裝資料的函式是和student類本身是關聯起來的,我們稱之為類的方法:

class student(object):

def __init__(self, name, score):

self.name = name

self.score = score

def print_score(self):

print('%s: %s' % (self.name, self.score))

要定義乙個方法,除了第乙個引數是self外,其他和普通函式一樣。要呼叫乙個方法,只需要在例項變數上直接呼叫,除了self不用傳遞,其他引數正常傳入:

>>> bart.print_score()

bart simpson: 59

這樣一來,我們從外部看student類,就只需要知道,建立例項需要給出namescore,而如何列印,都是在student類的內部定義的,這些資料和邏輯被「封裝」起來了,呼叫很容易,但卻不用知道內部實現的細節。

封裝的另乙個好處是可以給student類增加新的方法,比如get_grade

class student(object):

...def get_grade(self):

if self.score >= 90:

return 'a'

elif self.score >= 60:

return 'b'

else:

return 'c'

類是建立例項的模板,而例項則是乙個乙個具體的物件,各個例項擁有的資料都互相獨立,互不影響;

方法就是與例項繫結的函式,和普通函式不同,方法可以直接訪問例項的資料;

通過在例項上呼叫方法,我們就直接操作了物件內部的資料,但無需知道方法內部的實現細節。

和靜態語言不同,python允許對例項變數繫結任何資料,也就是說,對於兩個例項變數,雖然它們都是同乙個類的不同例項,但擁有的變數名稱都可能不同:

>>> bart = student('bart simpson', 59)

>>> lisa = student('lisa simpson', 87)

>>> bart.age = 8

>>> bart.age

8>>> lisa.age

traceback (most recent call last):

file "", line 1, in

attributeerror: 'student' object has no attribute 'age'

python3 類和例項

物件導向最重要的概念就是類 class 和例項 instance 必須牢記類是抽象的模板,比如student類,而例項是根據類建立出來的乙個個具體的 物件 每個物件都擁有相同的方法,但各自的資料可能不同。仍以student類為例,在python中,定義類是通過class關鍵字 class stude...

Python3中的類和例項

1.類和例項class 類名 父類 基類 超類列表 passclass student def init self,name,age self.name name self.age age def printinfo self print name format self.name age form...

python3 物件導向 類和例項

面向過程的程式設計把電腦程式視為一系列的命令集合,即一組函式的順序執行。為了簡化程式設計,面向過程把函式繼續切分為子函式,即把大塊函式通過切割成小塊函式來降低系統的複雜度。物件導向程式設計 object oriented programming,簡稱oop,是一種程式設計思想。oop把物件作為程式的...