0

如何转换下面的类以使用attrs 库

class MyClass(object):
    def __init__(self, api, template=None, **kwargs):
        self.api = api
        self.param1 = param1
        if template is not None:
            self.template = api.get_template(desc=template)

具体来说,如何处理一个参数对另一个参数的初始化的依赖性?在我最初的尝试中,我从这样的课程开始:

@attr.s
class MyAttrClass(object):
    api = attr.ib()
    param1 = attr.ib()

但是我不确定如何处理该template属性?我最初的想法是这样做:

def __attrs_post_init__(self):
    self.template = api.get_template(desc=template)

不过,我想知道是否有更好的方法来实现这一点?

4

2 回答 2

1

我认为takes_selfto 的论点Factory可能对你有用。

我想我在这里看到的一个问题是你正在接受一个名为 template 的参数,看起来它是一种不同的东西(可能是 a str)而不是你设置的self.template(可能是 a Template)。我建议你给这些不同的名字,然后做这样的事情:

from attr import Factory, attrib, attrs
from attr.validators import instance_of

from my.code import API, Template

@attrs
class Foo(object):
    api = attrib(validator=instance_of(API))

    _template_name = attrib(validator=instance_of(str))

    template = attrib(
        validator=instance_of(Template),
        default=Factory(
            lambda self: self.api.get_template(self._template_name)
        ),
        takes_self=True,
        init=False,
    )
于 2017-10-16T20:05:49.083 回答
0

您的问题中的“param1”很难理解,我只能假设它来自“kwargs”?

@attr.s
class MyAttrClass(object):
    api = attr.ib()
    template = attr.ib(default=None)
    param1 = attr.ib()

    def __attrs_post_init__(self):
        if self.template is not None:
            self.template = api.get_template(desc=template)

应该是处理模板属性的可行解决方案,但我尚未解决的是如何处理 kwargs。我自己正在研究这个问题,所以一旦我发现一个解决方案就会发布一个解决方案。

于 2017-07-18T12:59:28.220 回答