class User:
def __init__(self, name: str, address: "Address"):
self.name = name
self.address = address
# ^ because let's say for some reason we must have
# an address for each user
class Address:
def __init__(self, owner: User, address_line: str):
self.owner = owner
self.address_line = address_line
Essa abordagem é útil se você tiver objetos com interdependências, como no exemplo acima. Provavelmente, existe uma maneira mais elegante de desembaraçar, mas pelo menos você pode fornecer dicas antecipadas no mesmo espaço de nome simplesmente fornecendo o nome do objeto.
No entanto, uma maneira melhor de fazer isso é usar um recurso chamado avaliação diferida de anotações. Você pode usar uma importação especial para alterar a maneira como as anotações são resolvidas no nível do módulo:
from __future__ import annotations
class User:
def __init__(self, name: str, address: Address):
self.name = name
self.address = address
# ^ because let's say for some reason we must have
# an address for each user
class Address:
def __init__(self, owner: User, address_line: str):
self.owner = owner
self.address_line = address_line
Quando você adicionar from __future__ import annotations No topo de um módulo, as anotações agora são resolvidas preguiçosamente para esse módulo – assim como se fossem dicas de cordas, mas o real objeto é referido em vez de apenas seu nome. Isso permite que os linheiros resolvam as coisas com muito mais força e completamente, e é por isso que é a solução recomendada para esse problema. Você ainda pode usar dicas de string onde são esperadas, mas elas devem ser eliminadas.
