装饰器原理

软件开发中要遵循“封闭”和“开放”原则:“封闭”——即已完成的功能禁止修改,防止引入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()

 

posted on 2018-03-05 14:53  望月又一  阅读(374)  评论(0编辑  收藏  举报