天天看點

python3中的type與object

在python中,一切皆對象,應該怎麼了解呢??

先來看幾個例子:

[root@localhost ~]# python3
Python 3.6.3rc1 (default, Feb 26 2018, 22:34:25) 
[GCC 4.8.5 20150623 (Red Hat 4.8.5-16)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> a = 1                       # 定義一個變量,值為1
>>> type(a)                     # 檢視變量a的類型,可以看出變量a是由int類執行個體而來
<class 'int'>
>>> type(1)                     # 檢視整數1的類型,結果也是由int類執行個體而來
<class 'int'>
>>> type(int)                   # 檢視int類的類型,得出結論:int類型是由type類執行個體化而來
<class 'type'>
>>> 
>>> str1 = 'aa'                 # 定義一個變量,值為'aa'字元串
>>> type(str1)                  # 檢視變量str1的類型,可以看出變量str1是由str類執行個體而來
<class 'str'>
>>> type('aa')                  # 檢視'aa'字元串的類型,結果也是由str類執行個體而來
<class 'str'>
>>> type(str)                   # 檢視str類的類型,得出結論:str類型是由type類執行個體化而來
<class 'type'>
>>> 
>>> class Goods:                # 自定義一個Goods商品類
...     pass
... 
>>> good1 = Goods()             # 執行個體化Goods類,得到執行個體化對象good1
>>> type(good1)                 # 檢視good1的類型,可以看到是由Goods類執行個體化出來的
<class '__main__.Goods'>
>>> type(Goods)                 # 檢視Goods類的類型,得出結論:Goods類是由type類執行個體化而來的
<class 'type'>           

同理,我們也可以使用type方法檢視list,tuple,dict,set等資料類型的類型,這些資料類型都是由type類執行個體化來的

>>> type(list)
<class 'type'>
>>> type(tuple)
<class 'type'>
>>> type(dict)
<class 'type'>
>>> type(set)
<class 'type'>           

是以,可以得出結論:

在python3中,所有資料類型的變量都是由對應的類來建立的,而建立資料類型的類都是由type類執行個體化得到是以,python中所有的資料類型都是type類執行個體化來的

在上面的例子裡,定義一個Goods類,然後根據Goods類執行個體化good1對象

>>> Goods.__bases__             # 檢視Goods類的基類,結果為object類
(<class 'object'>,)
>>> class TestGoods(Goods):     # 再定義一個TestGoods類,繼承Goods類
...     pass
... 
>>> TestGoods.__bases__         # 檢視TestGoods類的基類,結果顯示為Goods類
(<class '__main__.Goods'>,)           

是以,在定義類時,如果未指定類所繼承的父類,其基類都是object

從上面的例子知道,所有資料類型的變量都是由對應的類來建立的

>>> int.__bases__               # 檢視int類的基類,結果為int類是繼承自object類的     
(<class 'object'>,)
>>> str.__bases__               # 檢視str類的基類,結果為str類是繼承自object類的
(<class 'object'>,)
>>> tuple.__bases__             # 檢視tuple類的基類,結果為tuple類是繼承自object類的
(<class 'object'>,)
>>> list.__bases__              # 檢視list類的基類,結果為list類是繼承自object類的
(<class 'object'>,)
>>> dict.__bases__              # 檢視dict類的基類,結果為dict類是繼承自object類的
(<class 'object'>,)
>>> set.__bases__               # 檢視set類的基類,結果為set類是繼承自object類的
(<class 'object'>,)           

是以,object是最頂層基類

通過檢視python源碼,也可以驗證這個結論

python3中的type與object
python3中的type與object
python3中的type與object
python3中的type與object
python3中的type與object
python3中的type與object

在前面,已經知道,python所有資料類型的類型都是由type類執行個體化得到的,那麼type類又是由什麼執行個體化而來,type類的基類又是什麼呢

>>> type(type)                  # 檢視type的類型,結果也是type類
<class 'type'>
>>> type.__bases__              # 檢視type的基類,結果為object
(<class 'object'>,)           

通過檢視源碼,可以看到type類是繼承自object的

python3中的type與object

由此可以知道,type是一個類,同時type也是一個對象

object類是所有類的基類,object類的基類又是什麼呢??

>>> type(object)            # 檢視object的類型,結果為object類也是由type類執行個體化而來
<class 'type'>
>>> object.__bases__        # 檢視object的基類,結果為object類的基類為空
()           

綜上所述,object與type和class的關系如下圖所示

python3中的type與object