參考:https://blog.csdn.net/andybegin/article/details/80775773
學習python的同學都知道這么幾句話:
1. object類是所有新式類的父類
2. type是所有類的類
那么type和object是什么關系呢?
object是一個新式類,我們可以通過object.class和object.bases來獲取object所屬的類和他的父類。
首先比較object和type:
print('object', object.__class__, object.__bases__) print('type', type.__class__, type.__bases__) 輸出: object <class 'type'> () type <class 'type'> (<class 'object'>,)
- object和type都屬於 type類 class ‘type’。
- object的父類為空,說明它沒有繼承任何類。
- type的父類為 object類 class ‘object’。
然后比較list, dict和tuple:
print('list', list.__class__, list.__bases__) print('dict', dict.__class__, dict.__bases__) print('tuple', tuple.__class__, tuple.__bases__) 輸出: list <class 'type'> (<class 'object'>,) dict <class 'type'> (<class 'object'>,) tuple <class 'type'> (<class 'object'>,)
- list, dict和tuple都屬於type類 class ‘type’
- 父類都是object類 class ‘object’
比較一個實例化的list:
a = [1, 2] print(a.__class__) print(a.__bases__) 輸出: <class 'list'> --------------------------------------------------------------------------- AttributeError Traceback (most recent call last) <ipython-input-149-3008ef49a253> in <module>() 1 a = [1, 2] 2 print(a.__class__) ----> 3 print(a.__bases__) AttributeError: 'list' object has no attribute '__bases__'
- 實例化的list它的類型是
class MyClass: pass print('MyClass', MyClass.__class__, MyClass.__bases__) print('*'*50) print('MyClass Obj', MyClass().__class__) print('MyClass Obj', MyClass().__bases__) 輸出: MyClass <class 'type'> (<class 'object'>,) ************************************************** MyClass Obj <class '__main__.MyClass'> --------------------------------------------------------------------------- AttributeError Traceback (most recent call last) <ipython-input-155-1ed1608465fe> in <module>() 4 print('*'*50) 5 print('MyClass Obj', MyClass().__class__) ----> 6 print('MyClass Obj', MyClass().__bases__) AttributeError: 'MyClass' object has no attribute '__bases__'
- 自定義類本身屬於type類 class ‘type’ ,並且父類是object類 class ‘object’
- 自定義類的實例化的對象屬於類本身,並且對象不存在父類屬性
比較自定義元類:
class MyMetaClass(type): pass print('MyMetaClass', MyMetaClass.__class__, MyMetaClass.__bases__) 輸出: MyMetaClass <class 'type'> (<class 'type'>,)
- 元類本身屬於type類 class ‘type’ ,並且父類也是type類 class ‘type’。
總結一下:
type元類的類則是由type元類自身創建的。object類是由元類type創建的,但是type類又繼承了object類。
圖示:虛線表示源是目標的實例,實線表示源是目標的子類
參考:https://blog.csdn.net/piglite/article/details/78294112
參考2:https://blog.csdn.net/zhaohaibo_/article/details/80642631