0

我正在将attrs python 库用于继承自非 attrs 基类的子类。我想通过 kwargs 向孩子公开所有父参数,但无法弄清楚如何使用 attrs 进行处理。

基本示例:

@attr.s
class Child(Parent):
  x = attr.ib()
  # I want to pass through the b & c params to Parent
  b = attr.ib() 
  c = attr.ib()
  y = attr.ib(default=2)
  
  # more params

  def __attrs_post_init__(self):
    super(Child,self).__init__(a=2*self.x, b=self.b, c=self.c)

class Parent(object):
  def __init__(self, a, b, c):
    self.a = a
    self.b = b
    self.c = c
    # more params

我对父类没有很大的自由裁量权,但在将其设置为 attrs 时也看到了围绕默认值的挑战。有没有办法避免在 Child 上指定所有 Parent 参数?如果我不使用 attrs 我可以做一些类似的事情**kwargs_Parent并初始化super(Child,self).__init__(a=2*x, **kwargs)

4

1 回答 1

1

我认为像你这样的案例的最佳答案是即将到来的(剩下一个拉取请求)支持__attrs_init__https ://www.attrs.org/en/latest/init.html#hooking-yourself-into-initialization

这将允许您编写:

@attr.s(init=False)
class Child(Parent):
    x = attr.ib()

    def __init__(self, x, **kw):
        super().__init__(2*x, **kw)

        self.__attrs_init__(x)

但是,只要您只有一个简单的参数,您也可以自己分配属性。我假设它只是简化了,并且已经为这个特定的用例添加了这个功能。

免费奖励提示:如果您使用@attr.s(auto_detect=True)(或@attr.define默认将其设置为 True 的新功能),它将__init__自动检测您,您不必通过init=False.

于 2021-04-16T16:40:10.290 回答