快速理解
- 装饰器,从名字可以大概看出,其作用可以概括为: 增强(扩展)函数功能。
- 装饰器本质上就是: 以函数作为参数,能返回
包含调用该参数函数及其他功能的新函数
的一种函数。 - 装饰器通过在需要被装饰的函数的定义前一行添加
@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