【PY模块】写类神器 attr(内置库)

解决痛点

常规定义类的参数,如果参数很多(几十个),这样写,就很不方便

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)

mark

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))

mark

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)

mark

发表评论 / Comment

用心评论~