装饰器

# 类方法:@classmethod装饰,参数命名cls
# 静态方法:@staticmethod装饰,参数self
class S:
school='学习'
def __init__(self,name,age):
self.name=name
self.age=age
#实例方法
def p(self):
print(f'{self.name}')
#类方法
@classmethod
def s(cls):
print(f'{cls.school}')
#静态方法 内部未用到类的相关内容,可以将该函数定位为静态方法
@staticmethod
def c():
print('holl,word')

#实例方法 :对象名.方法名() 类.方法名(对象名)
#类方法 :对象名.方法名() 类.方法名
#静态方法 :对象名.方法名() 类.方法名

# 装饰器:给函数增加额外功能,它的本质是一个闭包函数
import time
def baiyu():
print("我是攻城狮白玉")
time.sleep(2)
def count_time(func):
def wrapper():
t1 = time.time()
func()
print("执行时间为:", time.time() - t1)
return wrapper
if __name__ == '__main__':
baiyu = count_time(baiyu) # 因为装饰器 count_time(baiyu) 返回的时函数对象 wrapper,这条语句相当于 baiyu = wrapper
baiyu() # 执行baiyu()就相当于执行wrapper()

#装饰器的语法糖
import time
def count_time(func):
def wrapper():
t1 = time.time()
func()
print("执行时间为:", time.time() - t1)
return wrapper
@count_time
def baiyu():
print("我是攻城狮白玉")
time.sleep(2)
if __name__ == '__main__':
# baiyu = count_time(baiyu) # 因为装饰器 count_time(baiyu) 返回的时函数对象 wrapper,这条语句相当于 baiyu = wrapper
# baiyu() # 执行baiyu()就相当于执行wrapper()
baiyu() # 用语法糖之后,就可以直接调用该函数了

# 闭包里面用nonlocal,改变量:作用对象是外层的变量,就是用在闭包里面

# 普及知识点:局部变量
# 局部变量:定义与函数内
# 全局变量:定义与函数内
num1=100 #全局变量
def r():
num2=3 #局部变量
global num1 #局部不能直接修改全局变量,如果需要修改用 global
num1 +=num2
print(num1)
r()

# 生成器:使用了 yield 的函数被称为生成器
# 在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值,
# 并在下一次执行 next() 方法时从当前位置继续运行。

import time
def test(): #生成器函数
print('第一次运行')
yield 1
time.sleep(3)
print('第二次运行')
yield 2
time.sleep(3)
print('第三次运行')
yield 3
g = test() #g上一个迭代器,由生成器返回生成
print(g)
print(g.__next__())
print(g.__next__())
print(next(g))
posted @ 2022-04-03 20:06  小山海  阅读(52)  评论(0)    收藏  举报