使用 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
.
我将 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
.