如何最好地使用 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。
在原版 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。