python object和type的关系-Python 的 type 和 object 之间是怎么一种关系?

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值