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__都可以随意指定(有一些限制),但大体上可以理解为就是个可以改的指针