手记

论type与object的关系----Python创世纪

这篇随笔的灵感来源于学习源码时对type及object关系的疑惑,主要参考了这篇论文:

http://www.cs.utexas.edu/~cannata/cs345/Class%20Notes/15%20Python%20Types%20and%20Objects.pdf

1.Object是什么?

  计算机的工作过程概括下来就是:读取'数据', 经由'逻辑'运算,输出'结果'

  数据在软件中的表示形式,是通过'键'指向存储地址,从而'引用'该地址中的值

  所以'程序'在干的事,就是告诉计算机,用什么'数据', 进行什么'逻辑'运算,一言以蔽之,就是操作键值对

  这里只谈'数据',不讲'逻辑'

  在面向对象中, 我们将键值对分门别类的放好,并封装成一个个对象

  'object'就是这样一个东西---python原初的对象.

 2.Type又是什么?

  先上代码:

>>> object
<class 'object'>
>>> type
<class 'type'>

>>> type(object)
<class 'type'>
>>> type(type)
<class 'type'>

>>> object.__class__ 
<class 'type'> 
>>> type.__class__ 
<class 'type'> 

>>> type.__bases__ (<class 'object'>,)
>>> object.__bases__()

  可以看到,从代码中体现的是:

    ·object和type都是类(class)

    ·object和type的类型(type)都是type

    ·type的父类是object,object则没有父类,源码中描述object为""" The most base type """

  接下来看一张图:

  图中虚线表示实例化关系,实现表示继承关系,可以看出:  

   ·因为object是type的实例,所以他的子类(list,tupe,dict)都是type的实例,即一个类的实例化对象的派生类也从属于该类

   ·因为mylist是list的实例,且list又是object的子类,所以mylist也是type的实例,即一个类的实例化对象的实例化对象也从属与该类

  现在再说这句话应该会更容易理解:

   objcet的type是type,object是type的实例,type是自己的实例

   因此两者之间互相依赖对方定义自身,可以说是鸡生蛋和蛋生鸡的关系

   

3.三生万物

  官方文档中有这么一个概念:

  Type Objects

  Type objects represent the various object types. An object’s type is accessed by the built-in function type(). There are no special operations on types. The standard module types defines names for all standard built-in types.

  type objects翻译过来就是类型对象, 其表示各种对象的类型,我们可以使用type()去访问任何对象的类型,type和object都属于Type Objects

  结合上面的阐述,可以勾勒出python中'对象'这个概念的全貌:

  object和type是两个原初的对象,由他们派生(实例化)的对象也可以分为两类:

    ·类型对象(type objects)

    ·非类型对象(non-type object)

  他们都是对象,不同的是,类型对象能够实例化新的对象,非类型对象则不可以,例如:

num = int(1)
# num是int实例化的对象,有具体的值,我们不会这么去调用他:num()

type(num)
>>> <class 'int'>type(int)
>>> <class 'type'>obj = object()
type(obj)
>>> <class 'object'>

  对象之间的关系,不外乎以下两种:

    ·父子关系( the subclass-superclass relationship)

    ·类型实例关系( the type-instance relationship )

# 我们可以通过实例化type来产生新的类型对象,然后再把这个类型实例化,当然,这个新的类型对象也必须继承自object:
type('A', (object,), {num=1})
# 这个写法可以清晰的表明类型对象是type的实例化,但我们在实际写代码的时候一般这样写:
class A(object):
    num=1
a = A()

# 我们还可以继承type来产生新的元类(metaclass):
class SubType(type):
  pass
# 通过新的元类,我们可以造出新的类型对象,
class array(metaclass=SubType):
  pass
# 该类型对象的类型则不再是type,而是SubType
type(array)
>>> <class 'SubType'>

   他们之间的关系如下图所示:

 .

  至此,我们完成了从object到type,再到Type Objects,进而'三生万物'的过程,从'对象'这一角度描绘出了Python这门语言的一个轮廓,相信大家都听说过画杨桃的故事,笔者水平尚浅,幸得窥见这一角度,希望在今后能从更多角度出发去观察,从而从二维升级到三维.

作者:Lorthevan

原文出处:https://www.cnblogs.com/lorthevan/p/10459097.html  

0人推荐
随时随地看视频
慕课网APP