02 Jan 2018
Python Types and Objects Part 4
我們已經走過一次 python 所有的 objects 了,這篇將做一個總結。
Python Objects Map
從上面這張圖,首先我們可以看到 metaclass,class 和 instance 之間的關係。另外還有下面幾點:
- 虛線(instance)可以越界(除了 type
- 實線(inheritance)不可以越界(除了 type,因為 object 是萬物之 __bases__
- 最右邊那區不能再長出實線,因為不能再有 subclass。(原文: too concrete to be subclassed)
- 最右邊那區也不能再長出虛線(原文: too concrete to be initiated)
- 左邊兩區是 types;最右邊那區是 non-type
- 如果我們透過繼承 <type ‘type’> 創了一個物件,那麼這個物件會在最左邊那區,他同時會是 <type ‘type’> 的 subclass 和 instance。
- <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