Home

abawchen's graffiti

02 Jan 2018

Python Types and Objects Part 4

我們已經走過一次 python 所有的 objects 了,這篇將做一個總結。


Python Objects Map

Python Objects Map

從上面這張圖,首先我們可以看到 metaclassclassinstance 之間的關係。另外還有下面幾點:

  1. 虛線(instance)可以越界(除了 type
  2. 實線(inheritance)不可以越界(除了 type,因為 object 是萬物之 __bases__
  3. 最右邊那區不能再長出實線,因為不能再有 subclass。(原文: too concrete to be subclassed)
  4. 最右邊那區也不能再長出虛線(原文: too concrete to be initiated)
  5. 左邊兩區是 types;最右邊那區是 non-type
  6. 如果我們透過繼承 <type ‘type’> 創了一個物件,那麼這個物件會在最左邊那區,他同時會是 <type ‘type’> 的 subclass 和 instance。
  7. <type ‘type’> 是所有 types 的 type,<type ‘object’> 是所有 type 的 superclass(除了 object 他自己)

Summary

  • Python 有兩種 type
    • Type objects: 可以產生 instance,可以被繼承
    • Non-type objects: 不能再產生 instance,也不能被繼承
  • <type ‘type’> 和 <type ‘object’> 是 primitive(原生)的兩個 objects
  • objectname.__class__ 會告訴你這個 object 是什麼 type
  • objectname.__bases__ 會告訴你這個 object 的 superclass,只有 object.__bases__ 是空的
  • 用 class 這個關鍵字(也可以指定 bases)來創建一個新的 object
  • 用 () 這個 operator 來創建一個實體,這個實體可以是 type 或是 non-type
  • 有一些 non-type 可以透過一些特殊的語法產生,像是 [1, 2, 3] 就會創建一個 <type ‘list’> 的實體
  • issubclass(A, B) 在下面兩種狀況的時候會回傳 true
    • B is in A.__bases__
    • isubclass(Z, B) is true for any Z in A.__bases__
  • isinstance(A, B) 在下面兩種狀況的時候會回傳 true
    • B is A.__class__
    • issubclass (A.__class__, B) is true

More built-in types

>>> import types #1
>>> types.ListType is list #2
True
>>> def f(): #3
... pass
...
>>> f.__class__ is types.FunctionType #4
True
>>>
>>> class MyList(list): #5
... pass
...
>>> class MyFunction(types.FunctionType): ... pass #6
...
Traceback (most recent call last):
File "<stdin>", line 1, in ?
TypeError: type 'function' is not an acceptable base type
>>> dir(types) #7
['BooleanType', 'DictProxyType', 'DictType', ..]

#1, #2: types 裡面有很多 built-in types
#3: def 會創建一個 function object
#4: function object 的 type 是 types.FunctionType
#5: 有些 built-in type 可以被繼承
#6: 有些不行
#7: 更多的 built-in types 可以自己玩玩

講了這麼多,我們到底了解這些東西到底要幹嘛?其實是要知道如何去操作一個 object 的 atrribute,像是 objectname.attributename,但具體的細節不在這邊描述,而是在 Python Arributes and Methods …Orz


Classic Classes

>>> class ClassicClass: pass #1
>>> type(ClassicClass) <type 'classobj'> #2
>>> import types
>>> types.ClassType is type(ClassicClass) #3
True
>>> types.ClassType.__class__ #4
<type 'type'>
>>> types.ClassType.__bases__ #5
(<type 'object'>,)

#1, #2, #3: 在 Python 3 之前,不指定 base 所產生的 class type 會是 <type ‘classobj’>(這個系列中第一次看到)
#4, #5: types.ClassType 看起來好像是另一種 type object

其實好像可以忽略他的樣子?因為之後可能就不存在了。


這個系列的文章就到這邊,翻完之後有讓我更了解 Python 一點(吧XD

Til next time,
abawchen at 19:17