34. @classmethod, @staticmethod, @property这些都是什么?

这些都是修饰类的方法的装饰器函数,加上@就可以修饰方法。

  • @classmethod 将修饰的函数重新修改为类方法。函数第一个参数为类cls

  • @staticmethod 将修饰的函数改为静态方法。不能被类的实例所调用。

  • @property 修饰方法可以改为一个属性,通过函数访问,但实际调用时和成员变量类似。

什么是装饰器及装饰器函数

装饰器函数用于修改被装饰函数的行为,也就是修改其他函数的功能的函数。例如 通用的给每个函数增加log功能就适合用装饰器函数。

例如hello是一个函数,有很多地方在调用,调用的方法不变,但如何在调用时, 增加一个输出语句呢,并且还有很多类似hello的函数需要增加输出语句。 这就要求不能修改hello本身的代码。

装饰器可以实现这个功能,装饰器内部定义了一个函数,这个内部函数内容 是输出一个语句,并返回本装饰的函数调用结果。装饰器函数仅返回内部函数。

在被装饰的函数上一行之处增加@并紧跟装饰器函数。

被装饰的函数调用方法不变,但函数行为已经方法改变,增加了一个输出语句。 例如::

from time import ctime

def deco_log(func):
    def wrappedFunc(name):
        print( '[%s] %s() called' % (ctime(), func.__name__))
        return func(name)
    return wrappedFunc


@deco_log
def hello(name="word"):
    print("hello ", name)

hello("china")

deco_log是一个装饰器函数,功能是将所修饰的函数增加一个调用输出。

装饰器是一种修改函数的一种便捷方式。 装饰器本质上就是一个函数,这个函数 接受其他的函数作为参数, 并将其以一个新的修改后的函数进行调用。主要应用 于增加日志,在通用框架下调用,性能测试等等。

装饰器的作用就是为已经存在的函数添加的额外功能,就像家庭装修一样。