Skip to content

Как написать возвращаемое значение для метода класса, возвращающего класс?

[!Warning] FYI В Python 3.11 завезли тип Self, который делает все то же самое

Допустим есть абстрактный класс, который делает сущность из json:

class WithFromJson:
    @classmethod
    def from_json(cls, json_: dict) -> ?:
        ...

И его наследник:

import dataclasses


@dataclasses.dataclass()
class Resp(WithFromJson):
    code: int
    msg: str

    def from_json(self, json_: dict) -> Resp:
        return {
            'code': json_['code'],
            'msg': json_['msg'],
        }

Как написать тайпинг для WithFromJson? Использовать TypeVar:

from typing import TypeVar


class WithFromJson:
    @classmethod
    def from_json(cls, json_: dict) -> 'WithFromJsonT':
        ...

WithFromJsonT = TypeVar('WithFromJsonT', bound=WithFromJson)