一. 从Python说起
Python是一门强大的语言,它包含了很多神奇的技巧,作为一门动态语言,天生的优势使得很多特性让静态语言难以达到。今天我们展示的就是Python中一个很有用特性:“Decorator”,中文可以译作“装饰器”,那么,Decorator是什么?
在Dr.Dobb’s的文章中有这样一段描述“Decorators are Python objects that can register,annotate,and/or wrap a Python function or object.”。
具体来说,Decorator就是一个对函数的封装,它可以让你不改变函数本身的情况下对函数的执行进行干预,比如在执行前进行权限认证,日志记录,甚至修改传入参数,或者在执行后对返回结果进行预处理,甚至可以截断函数的执行等等。
看到定义是不是有一定的熟悉感,没错,本质上来说,它就是我们常说的面向方面编程(Aspect-Oriented Programming),简称AOP,相信大家对AOP也是如雷贯耳了,由于动态语言本身上的优势,使得这类技术在动态语言平台上是如鱼得水。
public class MyClass{
[Logger(“Leven”)]
public string Test(string s) {
xxx
return xxx;
}
}
public delegate string TestMethodDelegate(string s);
public class LoggerAttribute : Attribute {
public string Name { get; private set; }
public LoggerAttribute(string name) {
Name = name;
}
TestMethodDelegate LoggerWrapper(TestMethodDelegate fun) {
return e => {
Console.WriteLine(“User is {0}.”, Name);
Console.WriteLine(“Start Logging”);
var result = Fun(e);
Console.WriteLine(“End Logging”);
return result;
}
}
}
public class MyClassWrapper : MyClass {
public override string Test() {
LoggerAttribute attribute =
typeof(MyClass).GetMethod(“Test”).GetCustomAttribute(typeof(LoggerAttribute), true)[0] as LoggerAttribute; //获取基类中的第一个LoggerAttribute
//调用LoggerWrapper方法,获取新的委托.
var fun = attribute.LoggerWrapper(new TestMethodDelegate(Test));
return fun();
}
}