class,metaclass,instance,subclass,base
以下成立:
對任意的A,A是instance(推論:任意class也是instance)
對任意A,存在B,使得B是A的class
A是class 定義為 從A可以創建B(直接或間接),使得B是A的instance
A是B的metaclass 等價于 B是class,且A是B的class(也就是class的class)
A是metaclass等價于A是class,且從A創建的instance B是class
推論:對任意A是class,存在B使得B是A的metaclass
type的metaclass是type自己
對A和B是class,A是B的base等價于B是A的subclass(這里為了防歧義規定A不是A的subclass,可能與iasubclass不同)
A是B的base,則B不是A的base
A是B的instance當且僅當:B是A的class,或B是A的class的base
object是所有其他class的base(推論:任意A是object的instance,包括object)
推論:沒有類是object的base
type是所有其他metaclass的base
推論:object是type的base
type是object的metclass
type是type的class/metaclass
type是type的instance
object是object的instance
type是object的instance
object是type的instance
注意:metaclass的base不一定是metaclass
class與instance,base與subclass只是兩種正交的關系,它們通過isinstance相互聯系,在Python中并不要求它們有先后順序
=================================================
我補充一下什么叫做“不要求有先后順序”,實際上在Python當中自定義類的__bases__,自定義實例的__class__是可以修改的……
>>> class A(object): pass
...
>>> class B(object): pass
...
>>> class C(A): pass
...
>>> c = C()
>>> c.__class__
>>> C.__bases__
(,)
>>> isinstance(c, C)
True
>>> isinstance(c, A)
True
>>> isinstance(c, B)
False
>>> issubclass(C, A)
True
>>> issubclass(C, B)
False
>>> C.__bases__ = (B,)
>>> issubclass(C, A)
False
>>> issubclass(C, B)
True
>>> isinstance(c, A)
False
>>> isinstance(c, B)
True
>>> c.__class__ = A
>>> isinstance(c, C)
False
>>> isinstance(c, B)
False
>>> isinstance(c, A)
True
本質上來說就是一個指向的關系,想怎么改就可以怎么改,只要不違背我上面所說的法則就行。Python里的class和instance就是這樣沒有節操的東西……
我們下面來造一個A是B的metaclass,B是A的base的例子:
>>> class A(type): pass
...
>>> class B(metaclass=A): pass
...
>>> A.__bases__ = (type, B)
>>> isinstance(B, A)
True
>>> issubclass(A, B)
True
>>> isinstance(B, B)
True
由于Python實現的問題,不是所有的__bases__和__class__都可以隨意指定(有一些限制),但大體上可以理解為就是個可以改的指針