装饰器原理
软件开发中要遵循“封闭”和“开放”原则:“封闭”——即已完成的功能禁止修改,防止引入bug,“开放”——即对功能可进行扩展开发。
python的装饰器可完美胜任此功能,通过装饰器对功能进行扩展。简单的比如添加日志,统计次数、时间等。
装饰器一般分三部分完成:
1、定义装饰器:
def decorate(func): def wrapper(*args, **kwargs): xxx xxx xxx return func(*args, **kwargs) return wrapper
2、装饰函数(f):
@decorate def f(x, y): print x+y
3、调用函数(f):
f(2, 3)
这样,一个装饰器就算完成了。
在上述步骤中,先执行 1、定义装饰器代码:
执行完成后,将函数decorate加载到内存中。
然后,执行 2、装饰函数(f):
@decorate相当于decorate(f),执行后的返回值为函数wrapper,并会将函数名wrapper赋值给@decorate下面的函数的函数名。
最后,执行 3、调用函数(f):
此时,函数名wrapper赋值给@decorate下面的函数的函数名,因此,调用函数f,就相当于调用函数wrapper。
====================================================================================================
装饰器分类
装饰器可分为带参数和不带参数两类:
def decorate(func): def wrapper(): print 'here it is!' func() return wrapper return decorate @decorate def fun(): print 'i am fun' fun()
def f(x): print x def decorate(func): def wrapper(*args, **kwargs): print 'here it is!' func(*args, **kwargs) return wrapper return decorate
@f('==========') def fun(x, y): print x[3]+y fun({2:8, 3:3},2)
存在多个解释器时,由下向上依次执行。
静态方法(@staticmethord)和类方法(@classmethord)
静态方法与类有关,但调用不需要实例和类的参与。因此不需要传入self和表示类自身的cls参数。
静态方法与类方法 都可以通过类名访问、都可以通过实例访问,但都不能访问实例属性。
使用@staticmethord是为了把与类有关的函数写在类里面,整洁、好看。
class A(): def fun(self): pass @staticmethord def fun1(): pass A.fun1()
类方法@classmethord的调用也不需要传入self,但要传入表示类本身的cls参数
class A(): def fun(self): pass @classmethord def fun1(cls): cls.fun() A.fun1()