@classmethod

基本介绍

  • @classmethod 是 Python 中的一个装饰器,作用是把一个方法封装成类方法 。

  • 类方法是什么,就是可以直接使用类,无需实例化调用的方法叫做类方法。

  • 比如:

  • class DateUtils:    
        @classmethod
        def get_time(cls):
            import datetime
            return datetime.datetime.now()
     
    #类调用
    year1 = DateUtils.get_time
    print(year1)
    
    #实例化后调用
    date = DateUtils()
    year2 =n date.get_time
    print(year2)
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39



    # @model_validator(mode="")(pydantic库)

    ## 可输入参数:

    * `before`和`after`

    * 区别如下:

    - `@model_validator(mode="before")` 在`pydantic`模型进行内置类型和约束验证前执行 ,处理的是原始输入数据,通常为字典形式。可以对数据进行转换,如将字符串转为数字,还能进行数据清理等操作,之后返回处理过的字典供后续验证。比如输入的日期是多种字符串格式,可在`before`验证中统一转换为指定日期格式。

    - `@model_validator(mode="after")` 在模型完成内置验证后执行,此时面对的是已经初步验证通过的模型实例对象,不能对数据来源进行转换,但能基于完整的实例对象做进一步检查。

    - 通俗地来说`@model_validator`中参数为`before`时该模型中的检查方法更倾向于对输入格式的检查和转换

    - 而后者,即参数为`after`的时候,更加倾向于在数据格式都毫无疑问的时候,单纯对数据大小关系进行检查,其重点没有放在格式上面,而是数值关系,所以叫`after`。

    ```python
    from pydantic import BaseModel, model_validator

    class TimeInterval(BaseModel):
    start_time: int
    end_time: int

    @model_validator(mode="after")
    def check_time_order(cls, instance):
    if instance.start_time >= instance.end_time:
    raise ValueError("开始时间必须早于结束时间")
    return instance

    # 测试
    try:
    time_data = {"start_time": 1672531200, "end_time": 1672534800}#直接验证数值大小
    time_interval = TimeInterval(**time_data)
    print(time_interval)
    except ValueError as e:
    print(f"验证失败: {e}")