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()系列函式:
>>> classmyclass(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()。例子如下:
classc(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...