/images/hugo/avatar.png

04 实现一个通用装饰器

本节我们将实现一个"通用装饰器",它能够让用户提供的包装函数通过传入的参数判断其被使用的上下文,即确定,它是被应用在函数,实例方法,类方法,类对象中的哪一个。因为装饰器不是在各个环境种被单独实现,而是以一种更加统一的方式创建,所以将这种能确定上下文的装饰器称为通用装饰器。

03 使用工厂函数创建装饰器

上一篇文章描述了一种基于代理对象创建装饰器的模式,并且通过将装饰器实现为一个描述符,解决了当装饰器应用于类方法时,对象绑定问题。代理对象和描述符的组合自动确保了内省机制能正常进行。现在的问题是如何消除样本代码来解决代码复用的问题。

02 装饰器与描述符协议

上一篇文章说明了普通函数实现的装饰器存在的问题。本文我们将着眼于之前阐述的最后一个问题,如何将装饰器应用到一个描述符上。

1. 描述符协议

有关 Python 的对象模型和底层设计原理推荐大家读一读《流畅的Python》,这里不会详细解释描述符是什么以及他们的工作原理。简而言之,描述符就是存在绑定行文的对象,即属性访问会被描述符协议实现的方法所覆盖。实现描述符协议的特殊方法包括 __get__(), __set__(), 和 __delete__()。如果任意一中方法在一个对象中被定义,就可以说该对象是一个描述符**

01 如何实现一个 Python 装饰器

稍微对 Python 有所了解的程序员一定知道 Python 装饰器和函数闭包。我曾经也以为很了解,直到在《流畅的Python》中看到了 Wrapt 模块。

Wrapt 模块的作者 Graham Dumpleton 先生写了 14 篇博客详细讲解了如何在 Python 中实现一个能同时包装函数,类方法,实例方法的通用装饰器。本文以及接下来几篇文章是我对那 14 篇博客的整理和笔记。

22.3 sudo

sudo

/images/linux_mt/linux_level2.jpg

sudo是linux系统管理指令,它允许用户临时以其他用户(通常是root)执行一些或全部指令,其实现的是一种授权机制。普通用户想执行root 用户的特权命令时,可以使用 su 切换到管理员,但是这样做有两个坏处,一是 root 用户会被普通用户知道,二是普通用户切换为 root 后获取的是 root 的所有权限,这些都存在安全风险。而 sudo 可以实现授权普通用户执行部分或全部命令,同时无需 root 密码。本节我们就来介绍 sudo 的使用,内容如下:

22.2 日志管理系统rsyslog

日志管理系统rsyslog

/images/linux_mt/linux_level2.jpg

rsyslog 是Linux 系统上日志管理系统,应用程序可直接调用 rsyslog 的接口将日志写入到 rsyslog 特定的 facility 中即可完成日志记录。如果应用程序通过 rsyslog 来记录日志,通常在其自己的配置文件中有专门的选项用来定义将日志存入到 rsyslog 哪个 facility。facility 可以理解为 rsyslog 日志收集器的基本单元,rsyslog 内部的配置文件定义了每个 facility 的日志存储于何处。应用程序只需要将日志信息教给 rsyslog,rsyslog 会自动根据日志所属的 facility 将日志存储到对应的位置。本节我们就来详细介绍 rsyslog 的配置使用