如何最好地使用 attrs 中的属性初始化 class?

How best to initialize a class using an attribute from attrs?

在原版 Python 中创建一个 class,当它启动时,也会启动另一个 class 我会使用 __init__(self):

class SomeClass:
    __init__(self, token: str):
        self.token = token
        client = WebClient(auth=self.token)

但是在属性中,我不能这样做。以下会产生错误,因为它传递的是 _CountringAttr 对象,而不是已解析的字符串。

@attr.s()
class SomeClass:
    token: str = attr.ib()
    client = WebClient(auth=token)

完成此任务的“正确”方法是什么?

您可以使用默认值:

@attr.define
class SomeClass:
    token: str
    client: WebClient = attr.field()  # needed! attr.ib works too

    @client.default
    def _client_factory(self):
        return WebClient(self.token)

__attrs_post_init__:

@attr.define
class SomeClass:
    token: str
    client: WebClient = attr.field(init=False)

    def __attrs_post_init__(self):
        self.client = WebClient(self.token)

P.S。我正在使用现代 attrs API 来提高它们的知名度。如果您想了解更多,请查看 https://www.attrs.org/en/latest/names.html