Python MRO 与多继承

Python MRO 与多继承

MRO: Method Resolution Order(方法解析顺序)

MRO虽然叫方法解析顺序,但是它不仅针对方法搜索,对于类中的数据属性也适用。

目前版本 Python 中的 class 分为 classical 和 new-style 两大类。 其中 classical 是 python 一直沿用的,而 new-style 是 2.2 才开始引入的东西。

只要 class 继承于 object,或 bases class 里面任意一个继承于 object,这个 class 都是 new-style。

对于复杂的继承结构,class 中 method 的调用顺序(MRO)也是不同的。

  • classical,古典类用的是简单的自左至右的深度优先方法,简单概括为深入优先
  • new-style 则是C3 MRO搜索方法,简单概括为广度优先

Fabric 用法

介绍

Fabric是一个Python(2.5-2.7)库,用于简化使用SSH的应用程序部署或系统管理任务。

它提供的操作包括:执行本地或远程shell命令,上传/下载文件,以及其他辅助功能,如提示用户输入、中止执行等。

本文主要介绍fabric用法,主要参考fabric 文档

安装

利用pip安装

pip install fabric

Fabric 使用

核心API主要有七类:

  • 带颜色的输出类(color output)
  • 上下文管理类(context managers)
  • 装饰器类(decorators)
  • 网络类(network)
  • 操作类(oprations)
  • 任务类(tasks)
  • 工具类(utils)

Python数据结构 collections

Python数据结构 collections

Python包括很多标准编程数据结构,如list,tuple,dict,set,这些属于内置类型。

collections模块包含多种数据结构的实现,扩展了其他模块中相应的结构:

  1. deque是一个双端队列,允许从任意一端增加或删除元素。
  2. defaultdict是一个字典,如果找不到某个键,会相应一个默认值。
  3. OrderedDict会记住增加元素的序列。
  4. nametuple扩展了一般的tuple,除了为每个成员元素提供一个数值索引外还提供了一个属性名。

Nginx实现TCP反向代理

默认Nginx只支持http的反向代理,要想nginx支持tcp的反向代理,还需要在编译时增加tcp代理模块支持,即nginx_tcp_proxy_module。 同时,为了检测后端主机的状态,还需要其他相关模块支持。为了使用完整功能,需要的模块包括:

  • ngx_tcp_module
  • ngx_tcp_core_module
  • ngx_tcp_upstream_module
  • ngx_tcp_proxy_module
  • ngx_tcp_upstream_ip_hash_module

Python functools模块

Python functools模块

functools主要有以下包:

  • partial
  • reduce
  • update_wrapper
  • wraps

dir(functools)查看

['WRAPPER_ASSIGNMENTS',
 'WRAPPER_UPDATES',
 '__builtins__',
 '__doc__',
 '__file__',
 '__name__',
 '__package__',
 'cmp_to_key',
 'partial',
 'reduce',
 'total_ordering',
 'update_wrapper',
 'wraps']

partial

partial可以重新绑定函数的可选参数,生成一个callable的partial对象

partial常用场景:

  • 修改函数签名
  • 使用一些参数固化,以提供一个更简单的函数供以后调用

用法:

from functools import partial
from operator import add

add1 = partial(add, 1)
add1(3)
# 结果
4

reduce

reduce, 和python内置的reduce是一样的

update_wrapper

update_wrapper是wraps的主要功能提供者,它负责考贝原函数的属性,默认是:’module’, ‘name’, ‘doc’, ‘dict’。

update_wrapper把被封装函数的__name__、module、__doc__和 __dict__都复制到封装函数去

wrapper

其实也就是相当于在调用了partial,使用wraps可以把整个function的属性都带上。

wraps主要是用来包装函数,使被包装含数更像原函数,它是对partial(update_wrapper, …)的简单包装.

from functools import wraps
def my_decorator(f):
    @wraps(f)
    def wrapper(*args, **kwds):
        print 'Calling decorated function'
        return f(*args, **kwds)
    return wrapper

@my_decorator
def example():
    """Docstring"""
    print 'Called example function'
example()
print example.__name__
print example.__doc__

# 结果
Calling decorated function
Called example function
example
Docstring

Python operator模块

Python operator模块

operator模块是python中内置的操作符函数接口,它定义了一些算术和比较内置操作的函数。它是用c实现的,所以执行速度比python代码快。