内置函数

@magic function

定义了__init__()方法的类,会在创建对象的时候自动执行__init__()方法中的操作

  • 运算符: 对应特定方法的调用

    • 'abc' + 'xyz' 'abc'.__add__('xyz') #两个对象是否能进行加法运算,首先就要看相应的对象是否有add()方法
    • (1.8).__mul__(2.0)
    • True.__or__(False)
  • 一些内置函数

    • len([1,2,3]) [1,2,3].__len__()
    • (-1).__abs__()
    • (2.3).__int__()
    • li[3] li.__getitem__(3)

函数也是一种对象。任何一个有__call__()特殊方法的对象都被当作是函数

class SampleMore(object):
    def __call__(self, some_arg):
        #some code

描述器

一个描述器是一个有“绑定行为”的对象属性(object attribute),它的访问控制被描述器协议方法重写。这些方法是 __get__(), __set__(), 和 __delete__() 。有这些方法的对象叫做描述器

上下文管理器: with...as...的本质

规定了文件对象f的使用范围

class VOW():
    def __init__(self):
        print 'init'
    def __enter__(self):
        print 'enter'    
        return self     #__enter__()返回一个对象。上下文管理器会使用这一对象作为as所指的变量
    def __exit__(self,exc_type,exc_value,traceback):
        print 'exit'         # exc_type, exc_value, traceback用于描述异常。正常运行结束,这三个参数都是None

with VOW() as myvow:
    print('inside')
print('done')

对象属性

继承 class bird(object) 逐层向上查属性 obj.dict 分层存储属性,只存储该层新增的属性 class属性找到对象的类,然后调用类的base属性来查询父类

getattr_(self, name)来查询即时生成的属性

闭包

一个函数和它的环境变量合在一起,就构成了一个闭包(closure)

环境变量取值被保存在函数对象的closure属性 closure里包含了一个元组(tuple)。这个元组中的每个元素是cell类型的对象

利用闭包,我们实际上创建了泛函;一些逻辑结构已定,一些环境参数待定

闭包(closure)是函数式编程的重要的语法结构。函数式编程是一种编程范式 (而面向过程编程和面向对象编程也都是编程范式)。在面向过程编程中,我们见到过函数(function);在面向对象编程中,我们见过对象(object)。函数和对象的根本目的是以某种逻辑方式组织代码,并提高代码的可重复使用性(reusability)。闭包也是一种组织代码的结构,它同样提高了代码的可重复使用性。

def line_conf():
    b = 15 #b为line的环境变量,line作为line_conf的返回值时,line中已经包括b的取值(尽管b并不隶属于line)
    def line(x):
        return 2*x+b
    return line       # return a function object

在并行运算的环境下,我们可以让每台电脑负责一个函数,然后将一台电脑的输出和下一台电脑的输入串联起来。最终,我们像流水线一样工作,从串联的电脑集群一端输入数据,从另一端输出数据。这样的情境最适合只有一个参数输入的函数。闭包就可以实现这一目的。

装饰器(decorator)

定义了__get__, __set__, __delete__的对象

@method 对一个函数、方法或者类进行加工

装饰器的核心作用是name binding

自省

  • isinstance(object, classinfo)
  • dir([obj])
  • getattr(object, name[, default])
  • hasattr(obj, attr)
  • setattr(obj, attr, val) 相当于obj.bar = val
print getattr(Instance , 'age', 'not find')  
print getattr(Instance , 'method')(arg1, arg2)

内存

id(obj) 1# return obj-addr

obj1 is obj2 or id(obj1) == id(obj2)

垃圾回收

  • 计数为0
  • 分代回收 一些对象长期被使用,减少在垃圾回收中扫描它们的频率
  • __del__()销毁对象执行