python3 type和object的關系


參考: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'>,)
  1. object和type都屬於 type類 class ‘type’。
  2. object的父類為空,說明它沒有繼承任何類。
  3. 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'>,)
  1. list, dict和tuple都屬於type類 class ‘type’
  2. 父類都是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__'

 

 

  1. 實例化的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__'

  

  1. 自定義類本身屬於type類 class ‘type’ ,並且父類是object類 class ‘object’
  2. 自定義類的實例化的對象屬於類本身,並且對象不存在父類屬性

比較自定義元類:

class MyMetaClass(type):
    pass
print('MyMetaClass', MyMetaClass.__class__, MyMetaClass.__bases__)

輸出:
MyMetaClass <class 'type'> (<class 'type'>,)
  1. 元類本身屬於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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM