18.11. Typing Relations
18.11.1. Composition
>>> class Group:
... name: str
>>>
>>> class User:
... firstname: str
... lastname: str
... group: Group
18.11.2. Aggregation
>>> class Group:
... name: str
>>>
>>> class User:
... firstname: str
... lastname: str
... group: list[Group]
18.11.3. Forward Reference Problem
>>> class User:
... firstname: str
... lastname: str
... friends: list[User]
...
Traceback (most recent call last):
NameError: name 'User' is not defined
18.11.4. Forward Reference Solution: Str
Annotations can be a str
>>> class User:
... firstname: str
... lastname: str
... friends: list['User']
>>> class User:
... firstname: str
... lastname: str
... friends: 'list[User]'
>>> class User:
... firstname: 'str'
... lastname: 'str'
... friends: 'list[User]'
18.11.5. Forward Reference Solution: Future Annotations
Since Python 3.7
from __future__ import annotations
>>> from __future__ import annotations
>>>
>>> class User:
... firstname: str
... lastname: str
... friends: list[User]
>>> User.__annotations__
{'firstname': <class 'str'>, 'lastname': <class 'str'>, 'friends': list[__main__.User]}
18.11.6. Forward Reference Solution: Self
Since 3.11: PEP 673 - Self Type
>>> from typing import Self
>>>
>>> class User:
... firstname: str
... lastname: str
... friends: list[Self]
>>> User.__annotations__
{'firstname': <class 'str'>, 'lastname': <class 'str'>, 'friends': list[typing.Self]}
18.11.7. Forward Reference Solution: Deferred Evaluation
>>> class User:
... firstname: str
... lastname: str
... friends: list[User]