解决痛点
常规定义类的参数,如果参数很多(几十个),这样写,就很不方便
class TestInfo(): # 定义类参数 name: str = None age: int = None # 构造器 初始化 def __init__(self, name: str, age: int): self.name = name self.age = age # 为了方便打印 重写 __repr__ def __repr__(self): return f'{self.__class__.__name__}(name={self.name}, age={self.age})' if __name__ == '__main__': tinfo = TestInfo(name='boy', age=16) print(tinfo)
attr 写法
使用 attr 的写法,可以少写 __init 、__repr,并且打印也比较方便
from attr import attrs, attr, fields_dict @attrs class Info(): # 定义类参数 name = attr(type=str, default=None) age = attr(type=int, default=18) if __name__ == '__main__': info = Info(name='boy') print(info) print(fields_dict(Info))
attr 属性用法
参数 | 解释 |
---|---|
type | 类型,比如 int、str 等各种类型,默认为 None |
default | 属性的默认值,如果没有传入初始化数据,那么就会使用默认值,如果没有默认值定义,那么就是 NOTHING,即没有默认值 |
validator | 验证器,检查传入的参数是否合法,三个参数(实例,属性,值) |
init | 是否参与初始化,如果为 False,那么这个参数不能当做类的初始化参数,默认 是 True 。 |
metadata | 元数据,只读性的附加数据 |
converter | 转换器,进行一些值的处理和转换器,增加容错性 |
kw_only | 是否为强制关键字参数,默认为 False |
from attr import attrs, attr def age_va(instance, attribute, value): "instance: 实例 attribute: 参数 value: 值" print(instance.name) # boy if value > 18: raise ValueError(f'age 大于 18') @attrs class Info(): # 定义类参数 name = attr(type=str, default=None) age = attr(type=int, default=17, validator=age_va) if __name__ == '__main__': info = Info(name='boy', age=9) print(info)
版权声明:《 【PY模块】写类神器 attr(内置库) 》为明妃原创文章,转载请注明出处!
最后编辑:2022-1-11 12:01:20