注解
大约 2 分钟
Python中的注解(也称为装饰器)其实就是一个基于闭包的语法糖。
import time
from functools import wraps
def func1():
print("func1")
def func2():
print("func2")
# 如果想让 func1 和 func2 在不修改代码的情况都能打印出当前时间,有几种做法。
# 第一种做法
func1()
print(time.time())
func2()
print(time.time())
# 第二种做法
def current_time(func):
print(time.time())
func()
current_time(func1)
current_time(func2)
# 第三种做法
# 定义一个注解
def annotation(func):
# 通过可变参数和关键字参数,实现对任意调用的支持
def wrapper(*args, **kwa):
print(time.time())
func(*args, **kwa)
return wrapper
# 在定义函数时使用注解
@annotation
def func3():
print("func3")
func3()
@annotation
def func4(args):
print("func4 ==>", args)
func4('lixingyun')
@annotation
def func5(arg1, arg2, arg3):
print("func5 arg1 ==>", arg1)
print("func5 arg2 ==>", arg2)
print("func5 arg3 ==>", arg3)
func5('lixingyun', 'wanglin', 'xiaoyan')
# 关键字参数
@annotation
def func6(arg1, arg2, arg3, **kwargs):
print("func6 arg1 ==>", arg1)
print("func6 arg2 ==>", arg2)
print("func6 arg3 ==>", arg3)
print("func6 kwargs ==>", kwargs)
func6('lixingyun', 'wanglin', 'xiaoyan', arg4='qinyu', arg5='lindong', arg6='luofeng')
# 注解的副作用
@annotation
def func7():
'''
这是一段注释
'''
print(func7.__name__)
print(func7.__dict__)
# 不加注解和加上注解,打印结果显示,函数的名字被改变,注释内容也被改变
func7()
print(help(func7))
# 通过引入另一个注解来解决这种副作用
def annotation2(func):
# 调用wraps,解决注解的副作用
@wraps(func)
def wrapper(*args, **kwa):
print(time.time())
func(*args, **kwa)
return wrapper
@annotation2
def func8(arg1, arg2, arg3, **kwargs):
''' 这是一段注释 '''
print("func8 arg1 ==>", arg1)
print("func8 arg2 ==>", arg2)
print("func8 arg3 ==>", arg3)
print("func8 kwargs ==>", kwargs)
# 使用新注解之后,副作用没有了
func8('lixingyun', 'wanglin', 'xiaoyan', arg4='qinyu', arg5='lindong', arg6='luofeng')
print(help(func8))
# python3.7新增dataclass注解
from dataclasses import dataclass
# @dataclass(init = False, repr = False) 通过传入参数关闭生成构造器和repr方法
@dataclass(repr = False)
class Student():
name: str
age: int
# def __init__(self, name, age):
# self.name = name
# self.age = age
def print_info(self):
print('name: %s, age: %d' % (self.name, self.age))
def __str__(self):
return f"Student(name={self.name}, age={self.age})"
student = Student('lixingyun', 19)
student.print_info()
print(student)
# 关闭@dataclass生成的repr方法
print(student.__repr__())
感谢支持
更多内容,请移步《超级个体》。