python装饰器
装饰器的本质就是一个函数能为其它函数增加额外功能
装饰器不加参数
#coding:utf-8
from time import time
#装饰器函数
def elapsed(target):
"统计目标函数执行的耗时"
def decorated(*args,**kwargs):
start = time()
r = target(*args,**kwargs)
end = time()
print("函数执行的耗时:",end - start)
return r
return decorated
#对目标函数进行elapsed装饰器函数的调用
#返回一个装饰后的名字还是叫power_sum的函数
@elapsed
def power_sum(n):
total = 0
for i in range(1,n+1):
total += i ** 2
return total
if __name__ == '__main__':
#调用装饰器函数,装饰目标函数,得到一个装饰后的函数
# power_sum = elapsed(power_sum)
# print(power_sum(100000))
#加上python的装饰器后
print(power_sum(100000))
装饰器加上参数
#coding:utf-8
from time import time
#装饰器函数
def elapsed_precision(n):
def elapsed(target):
"统计目标函数执行的耗时"
def decorated(*args,**kwargs):
start = time()
r = target(*args,**kwargs)
end = time()
print("函数执行的耗时:",round(end - start,n))
return r
return decorated
return elapsed
#对目标函数进行elapsed装饰器函数的调用
#返回一个装饰后的名字还是叫power_sum的函数
@elapsed_precision(2)
def power_sum(n):
total = 0
for i in range(1,n+1):
total += i ** 2
return total
if __name__ == '__main__':
#调用装饰器函数,装饰目标函数,得到一个装饰后的函数
# power_sum = elapsed(power_sum)
# print(power_sum(100000))
#加上python的装饰器后
print(power_sum(100000))
装饰器写法的代码以及装饰器
#coding:utf-8
def func():
print("我是func函数")
value = (11,22,33,44)
return value
def outer(origin):
def inner():
print("before")
res = origin() #调用原来的func函数
print("after")
return res
return inner
func = outer(func)
result = func()
print(result)
#coding:utf-8
"""
其中我的这种写法就称为装饰器
实现原理:关于@语法和函数闭包,将原函数封装在闭包中,然后将函数赋值为一个新的函数(内层函数),执行函数时再在内层函数中执行闭包中的原函数
实现效果:可以在不改变原函数内部代码合调用方式的前提下,实现在函数执行和执行扩展功能。
适用场景:多个函数系统统一再执行前后自东一一些功能
"""
def outer(origin):
def inner(*args,**kwargs):
print("before")
res = origin(*args,**kwargs) #调用原来的func函数
print("after")
return res
return inner
@outer
def func1(a1):
print("我是func1函数")
value = (11,22,33,44)
return value
@outer
def func2(a1,a2):
print("我是func2函数")
value = (11,22,33,44)
return value
@outer
def func3(a1):
print("我是func3函数")
value = (11,22,33,44)
return value
func1(1)
func2(1,2)
func3(1)
装饰器加functools
#coding:utf-8
import functools
def auth(func):
@functools.wraps(func)
def inner(*args, **kwargs):
"""inner函数注释"""
res = func(*args, **kwargs) # 调用原来的func函数
return res
return inner
@auth
def admin():
"这个是admin函数"
print("123")
@auth
def rbac():
print("rbac")
print(admin.__name__)
print(admin.__doc__)
###输出结果是###
admin
这个是admin函数
python的实例方法、类方法、静态方法
#coding:utf-8
class Person:
def __init__(self,name,age):#实例方法,魔术方法
self.name = name
self.age = age
def say(self,something): #实例方法 自定义方法
print(something)
@classmethod
def walk(cls):
print("walking")
@staticmethod
def sleep():
print("sleep")
person = Person("name",18)
person.say("hh")
person.walk()
person.sleep()
try:
Person.say("123")
except Exception:
print("产生异常")
pass
Person.walk()
Person.sleep()
结果: