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

>>> 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]