Python基礎 19類和例項的內建函式

2022-07-03 15:30:25 字數 4201 閱讀 1635

1:issubclass()

issubclass()布林函式,判斷乙個類是否是另乙個類的子類或子孫類。它有如下語法:issubclass(sub,sup)

這個函式也允許「不嚴格」的子類,意味著,乙個類可視為其自身的子類,所以,這個函式如果當sub 就是sup,或者從sup 派生而來,則返回true。

從python 2.3 開始,issubclass()的第二個引數可以是可能的父類組成的元組,這時,只要第乙個引數是給定元組中任何乙個候選類的子類時,就會返回true。

2:isinstance()

isinstance(object,  classinfo)

判斷object是否為classinfo的例項(物件),或是其(直接、間接、virtual)子類的例項(物件)。(類<—>型別;例項<—>物件,python2.2之後,實現了類和型別的統一)。

classinfo可以是class物件(舊式類),也可以是type物件(新式類),或者是class或type物件組成的元組(只能是元組,其他序列不可以)。否則,會引發typeerror異常。

>>> class  c1(object):  pass

...>>> class c2(object): pass

...>>> c1 =c1()

>>> c2 =c2()

>>>isinstance(c1, c1)

true

>>>isinstance(c2, c1)

false

>>>isinstance(c1, c2)

false

>>>isinstance(c2, c2)

true

>>>isinstance(c2, c2)

traceback (innermost last):

file

"", line 1, in

?isinstance(c2, c2)

typeerror: s econd argument must be a

class

注意:第二個引數應當是類;不然,你會得到乙個typeerror。

也可以使用isinstance()來檢查乙個物件obj1 是否是obj2 的型別,比如:

>>> isinstance(4,  int)

true

>>> isinstance(4, str)

false

>>> isinstance('4'

, str)

true

3:hasattr(), getattr(), setattr(), delattr()

*attr()系列函式可以在各種物件下工作,不限於類(class)和例項(instances)。

當使用這些函式時,傳入正在處理的物件作為第乙個引數,但屬性名,也就是這些函式的第二個引數,是這些屬性的字串名字。

也就是在操作obj.attr

時,就相當於呼叫*attr(obj, 'attr'....)系列函式。

hasattr()函式是布林型的,它的目的就是為了判斷乙個物件是否有乙個特定的屬性,一般用於訪問某屬性前先作一下檢查。

getattr()和setattr()函式相應地取得和賦值給物件的屬性,getattr()會在試圖讀取乙個不存在的屬性時,引發attributeerror 異常,除非給出那個可選的預設引數。setattr()要麼加入乙個新的屬性,要麼取代乙個已存在的屬性。

而delattr()函式會從乙個物件中刪除屬性。下面一些例子使用到了*attr()系列函式:

>>> class

myclass(object):

...

def__init__

(self):

... self.foo = 100...

>>> myinst =myclass()

>>>hasattr(myinst, '

foo'

)true

>>>getattr(myinst, '

foo'

)100

>>>hasattr(myinst, '

bar'

)false

>>>getattr(myinst, '

bar'

)traceback (most recent calllast):

file

"", line 1, in

?getattr(myinst,

'bar')

attributeerror:myclass instance has no attribute

'bar

'>>>getattr(c, '

bar', '

oops!')

'oops!

'>>>setattr(myinst, '

bar', '

my attr')

>>>dir(myinst)['

__doc__

','__module__

', '

bar', '

foo'

]>>>getattr(myinst, '

bar')'

my attr

'>>> delattr(myinst, '

foo'

)>>>dir(myinst)['

__doc__

', '

__module__

','bar']

>>> hasattr(myinst, '

foo'

)false

4:dir()

dir([object])

如果沒有引數,返回當前區域性作用域內的名字列表。如果有引數,嘗試返回引數所指明物件的屬性的列表。

dir()作用在例項上時,顯示該例項的屬性名,還有在例項所在的類及所有它的基類中定義的屬性名。

dir()作用在類上時,則顯示該類以及它的所有基類的屬性名。但它不會顯示定義在元類(metaclass)中的類屬性。

dir()作用在模組上時,則顯示模組的屬性名。

注意,dir()

主要是為了在互動式環境下使用方便,它嘗試提供有意義的名字的集合,而不是提供嚴格或一致定義的名字的集合,且在不同的版本中,具體的行為也有所變化。

5:super()

這個函式的目的就是幫助找出相應的父類,然後方便呼叫相關的屬性。一般情況下,程式設計師可能僅僅採用非繫結方式呼叫祖先類方法。使用super()可以簡化搜尋乙個合適祖先的任務,並且在呼叫它時,替你傳入例項或型別物件。

語法如下:super(type[,obj])

super()「返回此type 的父類」。如果希望父類被繫結,則可以傳入obj 引數(obj必須是type 型別的).否則父類不會被繫結。obj 引數也可以是乙個型別,但它應當是type 的乙個子類。通常,當給出obj 時:

如果 obj 是乙個例項,isinstance(obj,type)就必須返回true

如果 obj 是乙個類或型別,issubclass(obj,type)就必須返回true

事實上,super()是乙個工廠函式,它創造了乙個super object,為乙個給定的類使用__mro__去查詢相應的父類。

super主要有兩種用途,第一種,在單繼承中,super可以用來在不具體署名的情況下引用父類,因此使得**更加健壯。這種用途類似於其他語言中super用途。

第二種用法用來實現「cooperative 類」。參見《python中的super》一文。

比如,super(myclass,self).__init__()。如果你沒有執行這樣的查詢,你可能不需要使用super()。

6:vars()

vars()內建函式與dir()相似,只是給定的物件引數都必須有乙個__dict__屬性。vars()返回乙個字典,它包含了物件儲存於其__dict__中的屬性(鍵)及值。如果提供的物件沒有這樣乙個屬性,則會引發乙個typeerror 異常。如果沒有提供物件作為vars()的乙個引數,它將顯示乙個包含本地名字空間的屬性(鍵)及其值的字典,也就是,locals()。例子如下:

class

c(object):

pass

>>> c =c()

>>> c.foo = 100

>>> c.bar = '

python

'>>> c.__dict__

>>>vars(c)

python 類和例項

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

python 類和例項

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

Python 類和例項的說明

定義類.def set name self,name 定義例項方法 self.name name def get name self 定義例項方法 print self.name p person 例項化物件 p.set name wu 例項化賦值 p.get name 例項呼叫例項方法 wu cl...