python中類的全面分析(上)

2021-08-21 17:14:42 字數 2992 閱讀 1276

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

類:對具有相同資料和方法的一組物件的描述或定義。

物件:物件是乙個類的例項。

例項(instance):乙個物件的例項化實現。

例項屬性(instance attribute):乙個物件就是一組屬性的集合。

例項方法(instance method):所有訪問或者更新物件某個例項一條或者多條屬性的函式的集合。

類屬性(classattribute):屬於乙個類中所有物件的屬性,不會只在某個例項上發生變化

類方法(classmethod):那些無須特定的物件例項就能夠工作的從屬於類的函式。

1)類概述

在python中,定義類是通過class關鍵字:

class student(object):

pass

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

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

>>> class student(object):

pass

>>> bart = student()

>>> bart

<__main__.student object at 0x00000160987c0630>

>>> student

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

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

>>> bart.name = 'bart simpson'

>>> bart.name

'bart simpson'

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

>>> class student(object):

def __init__(self, name, score):

self.name = name

self.scroe = score

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

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

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

>>> bart.name

'bart name'

>>> bart.score

592)物件屬性

python 中物件的屬性包含物件的所有內容:方法和資料,注意方法也是物件的屬性。查詢物件的屬性時,首先在物件的__dict__ 裡面查詢,然後是物件所屬類的dict,再往後是繼承體系中父類(mro解析)的dict,任意乙個地方查詢到就終止查詢,並且呼叫 __getattribute__(也有可能是__getattr__) 方法獲得屬性值。

方法:在 python 類中有3種方法,即靜態方法(staticmethod),類方法(classmethod)和例項方法:

1.對於例項方法,在類裡每次定義例項方法的時候都需要指定例項(該方法的第乙個引數,名字約定成俗為self)。這是因為例項方法的呼叫離不開例項,我們必須給函式傳遞乙個例項。假設物件a具有例項方法 foo(self, *args, **kwargs),那麼呼叫的時候可以用 a.foo(*args, **kwargs),或者 a.foo(a, *args, **kwargs),在直譯器看來它們是完全一樣的。

2.類方法每次定義的時候需要指定類(該方法的第乙個引數,名字約定成俗為cls),呼叫時和例項方法類似需要指定乙個類。

3.靜態方法其實和普通的方法一樣,只不過在呼叫的時候需要使用類或者例項。之所以需要靜態方法,是因為有時候需要將一組邏輯上相關的函式放在乙個類裡面,便於組織**結構。一般如果乙個方法不需要用到self,那麼它就適合用作靜態方法。

>>> def foo(x):

print('executing foo(%s)' % x)

>>> class a(object):

def foo(self):

print('executing foo(%s)' % self)

@classmethod

def class_foo(cls):

print('executing class_foo(%s)' % cls)

@staticmethod

def static_foo():

print('excuting static_foo()')

>>> a = a()

>>> print(a.foo)

>

>>> print(a.foo)

>>> print(a.class_foo)

>

>>> print(a.class_foo)

>

>>> print(a.static_foo)

>>> print(a.static_foo)

>>> print(foo)

在訪問類方法的時候有兩種方法,分別叫做 未繫結的方法(unbound method) 和 繫結的方法(bound method):

1.未繫結的方法:通過類來引用例項方法返回乙個未繫結方法物件。要呼叫它,你必須顯示地提供乙個例項作為第乙個引數,比如 a.foo。

2.繫結的方法:通過例項訪問方法返回乙個繫結的方法物件。python自動地給方法繫結乙個例項,所以呼叫它時不用再傳乙個例項引數,比如 a.foo。

python中的類知識分析

示例 class pydemo def init self print 公有類 class pydemo def init self print 保護類 class pydemo def init self print 私有類 說明 型別沒有下劃線開頭 public 單下劃線開頭 protected...

全面了解python中的類,物件,方法,屬性

全面了解python中的類,物件,方法,屬性 python中一切皆為物件,所謂物件 我自己就是乙個物件,我玩的電腦就是物件,坐著的椅子就是物件,家裡養的小狗也是乙個物件。我們通過描述屬性 特徵 和行為來描述乙個物件的。比如家裡的小狗,它的顏色,大小,年齡,體重等是它的屬性或特徵。它會汪汪叫,會搖尾巴...

全面了解python中的類,物件,方法,屬性

python中一切皆為物件,所謂物件 我自己就是乙個物件,我玩的電腦就是物件,坐著的椅子就是物件,家裡養的小狗也是乙個物件。我們通過描述屬性 特徵 和行為來描述乙個物件的。比如家裡的小狗,它的顏色,大小,年齡,體重等是它的屬性或特徵。它會汪汪叫,會搖尾巴等是它的行為。我們在描述乙個真實物件 物體 時...