如何使用 attrs python 包调用默认方法

How to invoke default methods with attrs python package

全部,

感谢您抽出宝贵时间尝试解决我的问题。我的问题与名为 attrs (https://www.attrs.org/en/stable/) 的特定 Python 包有关。我刚刚开始使用它并尝试在 Github 页面上提出相同的问题,但被要求将我的问题重定向到此处。

我正在寻找描述在使用 attrs 定义 classes 时如何调用默认方法的示例的文档。这是我想要做的事情的一个例子:

不使用属性

class Calculator: 
         def __init__(self, var_1: float, var_2: float): 
         """ Class initialization method
          
          :var_1: A positive integer 
          :var_2: Another positive integer 
          """ 
               self.var_1 = var_1 
               self.var_2 = var_2 
               self.sum = None

               # Invoke default method 
               self.set_sum() 
               
          def get_sum(): 
                self.var_1 + self.var_2 

           def set_sum(): 
                self.sum = self.get_sum()

使用属性

from attrs import define, validators
from typing import Union


@define
class Calculator: 
          var_1: float = field(validator=[validators.instance_of(float), validators.ge(0.))
          var_2: float = field(validator=[validators.instance_of(float), validators.ge(0.))
          sum: Union[float, None] = field(default=None, init=False)

          def get_sum(): 
                self.var_1 + self.var_2 

           def set_sum(): 
                self.sum = self.get_sum()

如果我知道对于计算器 class 的每个实例,我希望设置总和,我通常希望在我的 __init__ 方法定义中调用该方法。有人可以阐明我如何使用 attrs

做到这一点吗

我认为您正在寻找 __attrs_post_init__() (https://www.attrs.org/en/stable/examples.html?highlight=post_init#other-goodies)。

根据文档,它处理的用例是“您想让 class 的 __init__ 方法做的不仅仅是为您完成的初始化、验证等使用 @define."

时自动

文档显示了以下示例:

@define
class C:
    x: int
    y: int
    z: int = field(init=False)

    def __attrs_post_init__(self):
        self.z = self.x + self.y

obj = C(x=1, y=2)

在运行这段代码之后,obj会被初始化为C(x=1, y=2, z=3)。请注意,z=3 被设置为 xy.

的总和

实际上,您的 .__attrs_post_init__() 方法将在生成的 .__init__() 方法结束时自动调用。