一. 标准类型:

1.   None:  None类型的对象只用来表示一个值(”缺失“),它真正的值是False. python中用内建的名字None来访问这个对象。

2.    NotImplemented: NotImplemented类型对对象只用来表示一个值(”未实现“),它真正的值是True. python中用内建的名字NotImplemented来访问它。

                在比较函数中经常会用到此对象,表示未实现,它会通知运行时来做后续处理。而不像NotImplementedError抛出异常。

3.   Ellipsis:  Ellipsis类型的对象只用来表示一个值(”...“),它真正的值是True。 python中用内建的名字Ellipsis来访问这个对象。它通常用来切片语法中代表”...“


4.   Sequences: 序列类型,由非负下标进行元素索引,由len()计算元素个数。

序列类型根据其可变性又分为如下:

不可变序列: string, unicode, tuple

可变序列:list, byte arrays


5. Set: 集合类型,无序,元素为不可变类型, 不能通过下标索引(因为没有下标,其不是线程的), 但可迭代。

又根据集合的可变性分为set ,  frozen_set..

注:集合中的元素为什么要求是不变量类型呢?因为集合元素的唯一性指的是元素值的唯一性,在python里集合元素值的唯一性实际上是通过id的不同来间接保证的。

但对于可变类型对象,拥有相同表示值的对象可以拥有不同的ID,故python集合元素不支持可变对象。


6.  Mapping: 映射类型,当前仅有的映射类型为dict。

可变类型对象不能做为dict 的key, 因为可变类型对象是用值在来作比较而不是用id,


7.   可调用类型:

a.  用户定义的函数

__name__, 
__module__,
__defaults__    默认参数__code__  代表编译后的函数体
__globals__ 函数的全局变量
__dict__函数本身属性
__closure__ 闭包

b. 用户定义的方法

特殊属性:im_self

                                    im_class

                                    im_func   得到method object对应的function object。

c. 生成器    

        d. 内置函数

                 在模块__builtins__中,无需import, 可直接调用。这些函数是封装了的C实现。

        e. 内置方法

                 传递一个对象做为隐式的数给C函数。

f.  类类型

                产生类的实例,会调用__new__, __init__

        g. 经典类

                调用__init__

h.类实例

如果定义了__call__则,实例可被调用。

8. 模块

  模块对象通过import 引入。模块对象有一下由dict实现的命名空间。可通过__dict__查看。m.x 与m.__dict__['x']实质是一样的。

9. 类

        特殊属性:

        __bases__ 返回基类元组。

10.类的实例:

注意:类的__dict__与实例的__dict__是不同的。

11 文件

文件对象代表打开的文件。

12 内部类型:

一些类型是python解释器使用的,这些也暴露给了用户。

a. code object

               字节码对象.pyc文件是字节码的磁盘表现。

b.frame object 

               栈帧对象

        c. tracback对象

d. Slice对象


e staticmethod对象

f  classmethod对象


13 特殊方法:

a. 基本定制方法

a.a  __new__, __init__

new用来创建一个对象, init用来初始化创建出来的对象。

                        注1:new先被调用,init后被调用

注2:new必须返回一个实例,这样init才能使用这个实例。如果new没有返回一个实例,则init不会被调用, 调用者不能得到这个对象。

                        注3:输入数会先传给new,接着隐式传给init。new的参数与init的参数要一致。(cls, self除外)

注4:创建过程,子类new --》父类new-->子类init--》父类init.

a.b __del__

析构器。注:del() 并不会调用__del__,两者是不同的  del是将引用计数减一, __del__是当引用计数为0时,析构对象。

a.c __str__, __repr__, __unicode__.分别由str(), repr(), unicode()调用。

a.d rich comparisons 返回值 true or false。

a.e  __cmp__,返回值positive integer , 0 , negetive integer.

注:如果对象没有定义__cmp__及rich comparisons. 那对象的比较通过对象的object identity(id())。

a.f   __nonzero__ , 内建函数bool()调用,如果没有定义__nonzero__, 会调用__len__,如果__len__也没有定义,会返回true。

a.g __hash__, 由内建函数hash()调用,要求:比较相等的对象拥有相同的hash值。

注:对于不可变对象的比较是通过id()来比较的,对于可变对象的比较是通过值来比较的。


a.h  自定义属性访问

object.__getattr__(self, name),  object.__setattr__(self, name, value), object.__delattr__(self, name)


注1:这三个特殊方法都是类实例对象的绑定方法。所讨论的属性是类实例对象的属性。

对于setattr用来改变属性设置的默认行为。默认行为,如a.a=100,是在a的__dict__上入{‘a’:100}。如果要用setattr来设置属性,需要调用基类的setattr方法,即:object.__setattr__(self, name, value).

对于delattr是删除对象属性,为了和setattr相应,需要调用object.__delattr__(self, name).  一般情况下是不用定义这个的, 如非必要。

对于getattr是获得对象属性,这个函数其实最好与__getattribute__来比较。getattr是当获得对象失败时所做的操作,其需要返回一个值。即getattr是后处理(post-handler)。


新式类入的__getattribute__, 是一个真正改变获得对象属性行为的方法(相较于getattr)。如果要用__getattribute__来实现默认的行为,需要调用基类的getattribute,即object.__getattribute__(self, name).

另外需要注意的是,只有当__getattribute__明确的调用__getattr__, 或__getattribute__抛出AttributeError时,__getattr__才会被调用。


a.i  描述符及property

a.j  mro

新式类,广度优先, 从左到右。


a.k  __slots__

首先这是一个类变量。它改变了类实例对象存储属性的默认行为(__dict__)。这样节省了空间。__slots__把对象的属性限制在__slots__所列出来的名称。访问一个__slots__没有列出来的名称将导致attributeError。

注1:没有__dict__属性,就不能动态增对象属性。如果需要,要在__slots__中加入__dict__。

注2:没有__weakref__属性,就不能为对象建立弱引用,如果需要,要在__slots__中入__weakref__。

注3:__slots__是通过描述符来实现的。所以在类定义中,是不能重定义或初始化一个已在__slots__中指明的属性。否则,这个属性将会被重写。

注4:__slots__的定义只对本地类有影响,并不会影响子类。

注5:如果一个类是继承自可变长的内建类型,如long, str, tuple。那么这个类中是不能定义__slots__的,否则会引发TypeError。

注6:__class__属性所赋值要求左值与右值均定义了__slots__,或者均无定义__slots__。