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

python中object是什么类型_Python 的 type 和 object 之间是怎么一种关系?相关推荐

  1. python中关键字 表示空类型_python中什么表示空类型

    python中什么表示空类型? python中None表示空类型.表示该值是一个空对象,空值是Python里一个特殊的值,用None表示.None不能理解为0,因为0是有意义的,而None是一个特殊的 ...

  2. python中关键字 表示空类型_Python小知识:如何在Python 3中转换数据类型

    写在前面: 在Python中,数据类型用于对一种特定类型的数据进行分类,确定可以分配给该类型的值以及可以对其执行的操作. 这里主要讲述转换数字,字符串,元组和列表,并提供示例以帮助各位熟悉不同的用例. ...

  3. python中list是什么类型_Python 入门系列 —— 13. List 类型简介

    List List 常用于将多个值存储在一个变量中,在 Python 中 List 是四个内建集合之一,其他三个为:Tuple,Set 和 Dictionary,它们都有不同的特性和用途. List ...

  4. python中字母是什么类型_Python中只有一个字母的字符串属于字符类型。( )_学小易找答案...

    [单选题]下列选项中,用于标识为静态方法的是( ). [单选题]"多.夺.躲.惰"的区别在于( ) (7.0分) [单选题]子类能继承父类的一切属性和方法.( ) [单选题]使用类 ...

  5. python中list是什么类型_Python中的list数据类型

    创建列表 sample_list = ['a',1,('a','b')] Python 列表操作 sample_list = ['a','b',0,1,3] 得到列表中的某一个值 value_star ...

  6. python中如何区分文件类型_python准确判断文件类型

    判断文件类型在开发中非常常见的需求,怎样才能准确的判断文件类型呢?首先大家想到的是文件的后缀,但是非常遗憾的是这种方法是非常不靠谱的,因为文件的后缀是可以随意更改的,而大家都知道后缀在linux系统下 ...

  7. python中字典是什么类型_Python入门-Python中的基本数据类型-dictionary(字典)

    字典是一种映射类型,字典用"{ }"标识,它是一个无序的"键(key) : 值(value)"对集合."键(key)"必须使用不可变类型,如 ...

  8. python中set和dict类型_python从菜鸟到小仙的成长之路-----Dict和Set类型篇

    Dict: 花括号 {} 表示这是一个dict,然后按照 key: value, 写出来即可.最后一个 key: value 的逗号可以省略. d = { 'Adam': 95, 'Lisa': 85 ...

  9. python中lines是什么类型_python里的splitlines详解

    Python的split方法函数可以分割字符串成列表,默认是以空格作为分隔符sep来分割字符串. In [1]: s = "www jeapedu com" In [2]: pri ...

最新文章

  1. java combinationsum_Leecode39 combination-sum
  2. VS2010解决方案转换到VS2008
  3. python4delphi 设置syspath
  4. 精读《Epitath 源码 - renderProps 新用法》
  5. Django 序列化三种方式 对象 列表 元组
  6. Liferay Portal额外研究-银狐999
  7. ffmpeg 0.6.3 代码, 经过我努力,能够在vs 2005 下单步调试代码
  8. Linux系统瘦身裁剪 续
  9. 用例图-是外部用户(被称为参与者)所能观察到的系统功能的模型图
  10. 如何删除添加了.css()函数的样式?
  11. Luogu4074[WC2013] 糖果公园
  12. 服务器声卡硬件安装,win 2008虚拟声卡的配置
  13. 百度搜索url参数详解
  14. 主成分分析法步骤matlab,主成分分析法matlab实现程序
  15. catia怎么进入装配_catia装配详细教程
  16. You need to prove you’re evil cheap nike air max
  17. spilt的用法小结
  18. 如何安装2018matlab,MATLAB 2018a软件安装教程
  19. getch计算机错误,为什么getch()在C中抛出一个错误
  20. 2.3 响应文件(Response File)

热门文章

  1. mysql begin operations_MySQL入门(七):More JOIN operations
  2. 小型云台用的是什么电机_直流电机的工作原理是什么?未来的电动车都会用直流电机吗?...
  3. Windows 10如何消除文件夹右上角的“相对箭头”?
  4. Spring MVC源码——Root WebApplicationContext
  5. java使用Executor(执行器)管理线程
  6. Linux系统扩硬盘,Linux系统硬盘扩容
  7. java rt_java中rt包中源码了解
  8. python 如何快速判断列表是否相同_Python-检查列表中的所有元素是否相同
  9. python和c混合编程 gil,如何在python中使用C扩展来解决GIL
  10. atlas安装需要kafka吗_Atlas 2.1.0 实践(2)—— 安装Atlas