函数装饰器 (无参)
★要点说明:
- 装饰器符号为@
- 在定义函数的上方带有装饰器意味着,调用函数时候,先执行装饰器里面内容
- 使用装饰器可以让其他函数在不需要做任何代码变动的前提下增加其他功能
- 装饰器一般用于插入日志、性能测试、事务处理、缓存、权限校验
def test(func):
def execute():
print(func.__name__,"函数性能测试成功")
return execute
@test
def run():
print("success")
if __name__ == "__main__":
run()
def test(func):
def execute():
print(func.__name__,"函数性能测试成功")
return execute
def run():
print("success")
if __name__ == "__main__":
myfunc = test(run)
myfunc()
函数装饰器 (有参)
★要点说明:
- python装饰器有函数装饰器,类装饰器,内置装饰器
- 装饰器的返回值也是一个函数对象
def test(info):
def main(func):
def execute():
print(func.__name__,"函数性能测试成功")
print("装饰器的参数为",info)
return execute
return main
@test("info")
def run():
print(123)
if __name__ == "__main__":
run()
def test(info):
def main(func):
def execute():
print(func.__name__,"函数性能测试成功")
print("装饰器的参数为",info)
return execute
return main
def run():
print(123)
if __name__ == "__main__":
myfunc = test("info")(run)
myfunc()
类装饰器
★要点说明:
- __ call __ 该方法主要是把实例对象变为了可调用对象。
- 函数在使用类装饰器时候,会默认调用__ call __
class Kind:
def __init__(self,func):
self.func = func
def __call__(self):
print("当使用类装置器的时候就会默认调用此函数")
print("测试性能的函数为",self.func.__name__)
@Kind
def run():
print("success")
if __name__ == "__main__":
run()
内置装饰器
★要点说明:
- @property内置装饰器可以把方法变成属性来使用,一般来用获取属性信息
- 装饰器@score.setter是在@property本身又创建了另外的装饰器,一般用来修改属性信息
class Info:
def __init__(self,name):
self.__name = name
@property
def name(self):
return self.__name
@name.setter
def set_name(self,value):
self.__name = value
if __name__ == "__main__":
xiaoming = Info("小明")
xiaoming.set_name = "小尘"
print(xiaoming.name)
装饰器
简单模拟Flask
class Flask:
def __init__(self,name):
self.name = name
def route(self,info):
def main(func):
def execute():
func()
return execute
return main
def run(self):
hello()
app = Flask(__name__)
@app.route("/")
def hello():
print("hello world")
if __name__ == "__main__":
app.run()