python2.x 数据模型

一. 标准类型:

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.  用户定义的函数
     特殊属性:__doc__, 
__name__, 
__module__,
__defaults__    默认参数
__code__  代表编译后的函数体
__globals__ 函数的全局变量
__dict__函数本身属性
__closure__ 闭包
b. 用户定义的方法
特殊属性:im_self
                                    im_class
                                    im_func   得到method object对应的function object。
c. 生成器
 statement    yield
    
        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__。



buffer, array, bytearray, memoryview UserString  numpy

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值