全面理解python命名空間字典
python命名空間是屬性與對(duì)象的一一映射關(guān)系。
任何一個(gè)屬性通過(guò)命名空間都能找到唯一一個(gè)與之對(duì)應(yīng)的對(duì)象。
詳細(xì)點(diǎn)擊《python命名空間基礎(chǔ)知識(shí)》。
python的命名空間由字典實(shí)現(xiàn),屬性為鍵,對(duì)象為值。通過(guò)屬性找到對(duì)象。
1.1 dict
__dict__為類和實(shí)例的屬性字典—命名空間字典,通過(guò)字典找到屬性指向的對(duì)象。
實(shí)例無(wú)本身屬性則為空字典。
>>> class MySuper: s='梯閱線條' def m1(self): self.data1='MySuper' >>> class MyClassA(MySuper): def __init__(self): self.data2='MyClassA' # 類名.__dict__ 查看類的屬性字典, # 前后帶雙下劃線的為內(nèi)置屬性 , 其他為自定義屬性 >>> MySuper.__dict__.keys() dict_keys(['__module__', 's', 'm1', '__dict__', '__weakref__', '__doc__']) >>> msp=MySuper() # 實(shí)例名.__dict__ 查看實(shí)例的屬性字典, # 實(shí)例無(wú)本身屬性則為空。 >>> msp.__dict__.keys() dict_keys([]) # 調(diào)用m1()通過(guò)self.屬性=值,進(jìn)行屬性賦值 >>> msp.m1() # 實(shí)例名.__dict__ 只返回實(shí)例賦值的屬性,不返回類的屬性 >>> msp.__dict__.keys() dict_keys(['data1']) # 類名.__dict__ 只返回類屬性,不返回實(shí)例屬性 >>> MySuper.__dict__.keys() dict_keys(['__module__', 's', 'm1', '__dict__', '__weakref__', '__doc__']) >>> msp2=MySuper() # 每個(gè)實(shí)例有獨(dú)立的屬性字典 >>> msp2.__dict__.keys() dict_keys([]) # 創(chuàng)建實(shí)例時(shí)自動(dòng)執(zhí)行__init__()給實(shí)例屬性賦值 >>> mca=MyClassA() >>> mca.__dict__.keys() dict_keys(['data2'])
1.2 class
__class__獲取實(shí)例所屬類,再用獲取的類創(chuàng)建實(shí)例。
>>> class MyClass:pass >>> c1=MyClass() >>> c1 <__main__.MyClass object at 0x03D19C50> # __class__ 返回實(shí)例所屬類 >>> c1.__class__ <class '__main__.MyClass'> # 用返回的類創(chuàng)建實(shí)例對(duì)象 >>> c2=c1.__class__() >>> c2 <__main__.MyClass object at 0x03D19CF0>
1.3 class.name
class.__name__獲取實(shí)例所屬類的類名。
>>> class MyClass:pass >>> c1=MyClass() >>> c1=MyClass() # __name__ 返回實(shí)例所屬類的名字 >>> c1.__class__.__name__ 'MyClass'
1.4 bases
獲取類的直接超類組成的元組。
>>> class MyClass:pass >>> class MyClassA(MyClass):pass >>> class MyClassB():pass >>> class MyClassC(MyClassA,MyClassB):pass # __bases__ 返回直接超類組成的元組 >>> MyClassC.__bases__ (<class '__main__.MyClassB'>, <class '__main__.MyClassA'>)
1.5 搜索屬性
類屬性由全部實(shí)例共享,實(shí)例屬性每個(gè)實(shí)例相互獨(dú)立。
NO | 屬性 | 描述 |
---|---|---|
1 | 類屬性 | (1) 類屬性是指類頂層賦值生成的屬性。 (2) 全部實(shí)例共享類屬性。 |
2 | 實(shí)例屬性 | (1)實(shí)例屬性是指通過(guò)self.屬性名=屬性值,或?qū)嵗?屬性名=屬性值,獲取的屬性。 (2)每個(gè)實(shí)例的實(shí)例屬性相互獨(dú)立,互不干擾。 (3)實(shí)例無(wú)屬性時(shí),實(shí)例命名空間字典為空。 |
實(shí)例和類搜索屬性都在屬性命名空間字典查找。
搜索實(shí)例屬性先從實(shí)例屬性命名空間查找,再到類,超類查找,直到找到為止。
搜索類屬性從類屬性命名空間查找,再到超類查找,直到找到為止。
步驟 | 描述 |
---|---|
1 | 通過(guò)“實(shí)例名.dict”獲取實(shí)例屬性。 |
2 | 若無(wú),則通過(guò)“實(shí)例名.class”獲取實(shí)例所屬類。 |
3 | 通過(guò)“類名.dict”獲取類屬性。 |
4 | 若無(wú),則通過(guò)“類名.base”獲取實(shí)例所屬類的直接超類。 |
5 | 超類重復(fù)3到4步驟,獲取類屬性。 |
>>> class MySuper: s='梯閱線條' def m1(self): self.data1='MySuper' >>> class MyClassA(MySuper): def __init__(self): self.data2='MyClassA' >>> msp1=MySuper() >>> msp1.__dict__ {} >>> msp1.__class__.__name__ 'MySuper' >>> msp1.m1() >>> msp1.__dict__ {'data1': 'MySuper'} >>> mca1=MyClassA() >>> mca1.__dict__ {'data2': 'MyClassA'} >>> mca1.__dict__ {'data2': 'MyClassA'} >>> MySuper.__dict__.keys() dict_keys(['__module__', 's', 'm1', '__dict__', '__weakref__', '__doc__']) >>> mca1.m1() >>> mca1.__dict__ {'data2': 'MyClassA', 'data1': 'MySuper'} # 搜索s,從 MySuper.__dict__ 類命名空間獲取 >>> mca1.s '梯閱線條' # 搜索 data1 和 data2 從 實(shí)例命名看空間獲取 >>> mca1.data1 'MySuper' >>> mca1.data2 'MyClassA'
1.6 dir
dir(類或?qū)嵗?,返回類或?qū)嵗膶傩?,包括系統(tǒng)屬性,比__dict__.keys()多。
NO | 使用 | 描述 |
---|---|---|
1 | 類.dict.keys() | 返回類屬性,不包括系統(tǒng)屬性 |
2 | 實(shí)例.dict.keys() | 返回實(shí)例屬性,不包括類屬性 |
3 | 子類.dict.keys() | 返回子類屬性,不包括超類屬性 |
4 | 子類實(shí)例.dict.keys() | 返回子類實(shí)例屬性,不包括類和超類屬性 |
5 | dir(類) | 返回類屬性,包括系統(tǒng)屬性 |
6 | dir(實(shí)例) | 返回實(shí)例屬性,包括類屬性和系統(tǒng)屬性 |
7 | dir(子類) | 返回類屬性,包括超類屬性和系統(tǒng)屬性 |
8 | dir(子類實(shí)例) | 返回子類實(shí)例屬性,包括類、超類、系統(tǒng)屬性 |
示例
>>> class MySuper: s='梯閱線條' def m1(self): self.data1='MySuper' >>> class MyClassA(MySuper): def __init__(self): self.data2='MyClassA' >>> msp1=MySuper() # 類.__dict__.keys() 返回類屬性 >>> MySuper.__dict__.keys() dict_keys(['__module__', 's', 'm1', '__dict__', '__weakref__', '__doc__']) # dir(類) 比 類.__dict__.keys() 多 系統(tǒng)屬性 >>> dir(MySuper) ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'm1', 's'] # dir(實(shí)例) 返回類屬性 >>> dir(msp1) ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'm1', 's'] # 實(shí)例.__dict__.keys() 不返回類屬性 , 返回實(shí)例屬性 >>> msp1.__dict__.keys() dict_keys([]) # dir(類) 返回 超類的屬性 >>> dir(MyClassA) ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'm1', 's'] # 類.__dict__.keys() 不返回超類屬性 >>> MyClassA.__dict__.keys() dict_keys(['__module__', '__init__', '__doc__']) # dir(實(shí)例) 返回 超類的屬性 >>> dir(mca1) ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'data2', 'm1', 's'] # 實(shí)例.__dict__.keys() 不返回超類屬性 >>> mca1.__dict__.keys() dict_keys(['data2'])
1.7 繼承層次例子
通過(guò)__class__ 找到實(shí)例所屬的類,通過(guò) bases 找到超類,從而找到實(shí)例和類的繼承層次。
def classtree(cls,indent): print('| '* indent + '|-' + cls.__name__) # cls.__bases__ for supercls in cls.__bases__: classtree(supercls,indent+1) def instancetree(inst): print('Tree of {}'.format(inst)) # inst.__class__ 實(shí)例所屬類 classtree(inst.__class__,0) def selftest(): class A:pass class B(A):pass class C(A):pass class D(B,C):pass class E:pass class F(D,E):pass instancetree(B()) instancetree(F()) if __name__ == '__main__': selftest() ''' 運(yùn)行結(jié)果 E:\documents\F盤>python classtree.py Tree of <__main__.selftest.<locals>.B object at 0x01978A30> |-B | |-A | | |-object Tree of <__main__.selftest.<locals>.F object at 0x01978A30> |-F | |-D | | |-B | | | |-A | | | | |-object | | |-C | | | |-A | | | | |-object | |-E | | |-object '''
1.8 doc
python文檔字符串__doc__,值為模塊文件開頭、函數(shù)開頭、類開頭、方法開頭的注釋,python會(huì)自動(dòng)封裝這些注釋,并且保存在__doc__。這些注釋寫在三引號(hào)內(nèi)。
1.8.1 自定義文檔字符串
文檔字符串可以通過(guò)不同位置路徑對(duì)象的__doc__獲取。
不同路徑對(duì)象屬性名(函數(shù)名、類名、方法名)可以通過(guò)dir(模塊)獲取。
模塊:模塊名.doc
函數(shù):模塊名.函數(shù)名.doc
類:模塊名.類名.doc
方法名:模塊名.類名.方法名.doc
示例
''' 模塊文件名:docstr.py 模塊開頭的文檔字符串 ''' S='梯閱線條' def hellof(name): ''' 函數(shù)開頭的文檔字符串 ''' print('hello ',name) class Student: ''' 類開頭處的文檔字符串 ''' def study(self): ''' 方法開頭的文檔字符串 ''' pass # 查看不同對(duì)象的__doc__文檔字符串 >>> path=r'E:\documents\F盤' >>> import os >>> os.chdir(path) >>> import docstr >>> dir(docstr) ['L', 'S', 'Student', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'hellof'] >>> print(docstr.__doc__) 模塊文件名:docstr.py 模塊開頭的文檔字符串 >>> print(docstr.hellof.__doc__) 函數(shù)開頭的文檔字符串 >>> print(docstr.Student.__doc__) 類開頭處的文檔字符串 >>> print(docstr.Student.study.__doc__) 方法開頭的文檔字符串
到此這篇關(guān)于全面理解python命名空間字典的文章就介紹到這了,更多相關(guān)python命名空間字典內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python實(shí)現(xiàn)動(dòng)態(tài)數(shù)組的示例代碼
這篇文章主要介紹了python實(shí)現(xiàn)動(dòng)態(tài)數(shù)組的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07利用pandas進(jìn)行大文件計(jì)數(shù)處理的方法
今天小編就為大家分享一篇利用pandas進(jìn)行大文件計(jì)數(shù)處理的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-07-07讓代碼變得更易維護(hù)的7個(gè)Python庫(kù)
今天小編就為大家分享一篇關(guān)于讓代碼變得更易維護(hù)的7個(gè)Python庫(kù),小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-10-10Python整數(shù)與Numpy數(shù)據(jù)溢出問(wèn)題解決
這篇文章主要介紹了Python 的整數(shù)與 Numpy 的數(shù)據(jù)溢出,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09Python&&GDAL實(shí)現(xiàn)NDVI的計(jì)算方式
今天小編就為大家分享一篇Python&&GDAL實(shí)現(xiàn)NDVI的計(jì)算方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-01-01基于python3 OpenCV3實(shí)現(xiàn)靜態(tài)圖片人臉識(shí)別
這篇文章主要為大家詳細(xì)介紹了基于Python3 OpenCV3實(shí)現(xiàn)靜態(tài)圖片人臉識(shí)別,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-05-05