Python學習筆記:有關學習整理,第2章類型[1]

2.1.1 印象數據結構

咱們習慣將生物分爲動物,植物,進而又有貓科,犬科等細分,經過對個體的研究,概括其共同特徵,抽象成便於描述的種族模版,有了模版後,可據此建立大量行爲相似的個體,因此,分類是個基礎工程。函數

在專業術語上,咱們將族羣或類別乘坐類型(class),將個體叫作實例(instance)。類型持有同族個體的共同行爲和共享狀態,而實例僅保存私有特性便可。如此,在內存空間佈局上纔是最高效的。佈局

每一個實例都持有所屬類型的指針。須要時,經過它間接訪問目標便可。但從外在邏輯接口看,任何實例都是「完整」的ui

存活實例對象都有「惟一」id值:編碼

補充:spa

id()函數:用於獲取對象的內存地址3d

語法:id([object])指針

返回值:返回對象的內存地址。code

可用type返回實例所屬的類型:對象

要判斷實例是否屬於特定類型,可使用isinstance函數

補充:

isinstance()函數:判斷一個對象是不是一個已知類型

語法:isinstance(object, classinfo)

參數:

object -- 實例對象。
classinfo -- 能夠是直接或間接類名、基本類型或者由它們組成的元組。

返回值:若是對象的類型與參數二的類型(classinfo)相同則返回 True,不然返回 False。

isinstance() 與 type() 區別:
type() 不會認爲子類是一種父類類型,不考慮繼承關係。
isinstance() 會認爲子類是一種父類類型,考慮繼承關係。
若是要判斷兩個類型是否相同推薦使用 isinstance()

 

任何類型都是其祖先類型的子類,一樣,對象也能夠被斷定爲其祖先類型的實例

class A:
    pass
class B(A):
    pass
print(issubclass(B,A))

結果:

補充:

issubclass():用於判斷參數class是不是類型參數classinfo的子類

語法:issubclass(class, classinfo)

參數:

class -- 類
classinfo -- 類

返回值:若是 class 是 classinfo 的子類返回 True,不然返回 False

注意:全部類型都有一個共同的祖先類型object,它爲全部類型提供原始模版,以及系統所需的基本操做方式

class A:
    pass
class B(A):
    pass
print(issubclass(B,object))

結果:

 

類型雖然是抽象族羣概念,但在實現上也只是個普通的對象實例,區別在於,全部類型都是由type建立,這和繼承沒有關係

單就類型對象而言,其本質就是用存儲方法和字段成員的特殊容器,用同一份涉及來實現纔是正常思路,固然,類型對象屬於建立者這樣的特殊存在,默認狀況下,它們由解釋器在首次載入時自動生成,生命週期與進程相同,且僅有一個實例

2.1.2 名字

在一般認知裏,變量是一段具備特定格式的內存,變量名則是內存別名,由於在編碼截斷,沒法肯定內存的具體位置,故使用名稱符號代替

靜態編譯和動態解釋型語言對於變量名字處理方式的不一樣點:

靜態編譯:靜態編譯器或連接器會以固定地址,或直接、間接尋址指令代替變量名,也就是說,變量名不參與執行過程,可被剔除。

動態解釋型語言:名字和變量一般是兩個運行期實體。名字不但有本身的類型,還須要分配內存,並介入執行過程。甚至能夠說,名字纔是動態模型的基礎

名字必需要與目標對象關聯起來纔有意義,最直接的關聯操做就是負值,然後對名字的引用都被解釋爲對目標對象進行操做

賦值步驟:

1.準備好右值目標對象

2.準備好名字

3.在名字空間裏爲二者創建關聯(namespace{名字:目標對象})

即使如此,名字與目標對象也僅是引用關聯,名字只負責招人,但對此人一無所知。鑑於在運行期才能知道名字引用的目標類型,因此說Python是一種動態類型語言

名字空間:

名字空間(namespace):是專門用來存儲名字和目標引用關聯的容器

對Python而言,每一個模塊(源碼文件)都有一個全局名字空間。而根據代碼做用域,又有當前名字控件或本地名字空間一說,若是直接在模塊級別執行,那麼當前名字空間和全局名字空間相同,但在函數內,當前名字空間就專指函數做用域

名字空間默認使用字典數據結構,由多個鍵值對組成

內置函數globals和locals分別返回全局名字空間和本地名字空間字典

代碼1:

y=100
print(id(globals()))
print(id(locals()))
print(globals())
print(locals())

結果1:

30466768
30466768
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x00000000003A1CC0>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'D:/Pyexerice/func_lambda1.py', '__cached__': None, 'y': 100}
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x00000000003A1CC0>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'D:/Pyexerice/func_lambda1.py', '__cached__': None, 'y': 100}

此時globals和locals指向相同,因此內存地址相同,結果相同

代碼2:

def test():
    y = 100
    print(id(globals()))
    print(id(locals()))
    print(globals())
    print(locals())
test()

結果2:

30663376
39180904
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x0000000001CF1CC0>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'D:/Pyexerice/func_lambda1.py', '__cached__': None, 'test': <function test at 0x0000000001D2C1E0>}
{'y': 100}

能夠看到,此時globals和locals的內存地址不一樣,因而可知,globals老是指向模塊名字空間,而locals則是指向當前做用域環境

未完待續

相關文章
相關標籤/搜索