1

快速理解

  • 装饰器,从名字可以大概看出,其作用可以概括为: 增强(扩展)函数功能。
  • 装饰器本质上就是: 以函数作为参数,能返回包含调用该参数函数及其他功能的新函数的一种函数。
  • 装饰器通过在需要被装饰的函数的定义前一行添加@decorator_name的方式使用

举例说明

源函数

def hello():
    print("hello world!!!")

使用装饰器扩展hello()功能而不直接修改其定义

def log(func):
    """print function name before it's called"""
    def wrapper(*args, **kw):  # 闭包,实现装饰器的基础
        print('call %s():\n' % func.__name__, end="    ")
        return func(*args, **kw)  # 传递给wrapper的参数最后传递给了func
    return wrapper

@log
def hello():
    print("hello world!!!")

hello()

输出:

call hello():
    hello world!!!

将@log 放到hello()定义前一行,相当于执行以下过程

hello = log(hello)  # 此调用的执行效果等效于  log.func = hello, hello = log.wrapper

通过 @property 装饰器验证是否可以使用上述其等效方法替换正常修饰器的使用

class Student(object):
    # @property  # 作用是把类方法转换成类属性
    # def score(self):
    #     return self._score

    # 替换 @property的效果
    def score(self):
        return self._score
    score = property(score)

    @score.setter
    def score(self, value):
        if not isinstance(value, int):
            raise ValueError('score must be an integer!')
        if value < 0 or value > 100:
            raise ValueError('score must between 0 ~ 100!')
        self._score = value

a = Student()
a.score = 60
a.score

输出:

60

hzcyf
16 声望0 粉丝

什么鬼?