使用 python attrs 库将 kwargs 传递给基类

Passing kwargs to a base classs using python attrs library

我将 attrs python library 用于 child class,它继承自 non-attrs 基础 class。我想通过 kwargs 将所有 parent 参数公开给 child 但无法弄清楚如何使用 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

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

一样初始化

我认为对于像你这样的情况最好的答案是即将到来的(剩下一个拉取请求)对 __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)(或默认设置为 True 的新 @attr.define),它会自动检测您的 __init__,您将不会通过 init=False.