Как ограничить тип вывода метода абстрактного класса? - PullRequest
2 голосов
/ 31 мая 2019

Скажем, у меня есть абстрактный класс:

class A(metaclass=ABCMeta):

    def __init__(self):
        pass

    @abstractmethod
    def a_function(self) -> int:
        return 0

Я хочу ограничить тип вывода a_function, чтобы при наследовании класса от A вывод был целым числом.

Моей первой попыткой было создать декоратор для a_function класса A (см. Ниже).Но, конечно, это только ограничивает A.a_function

def constrain_type(f):
    def decorated(*args, **kwargs):
        output = f(*args, **kwargs)
        class_annotation = f.__annotations__["return"]
        if not issubclass(type(output), class_annotation):
            raise TypeError("this class must return an object inheriting from " +
                            class_annotation.__name__ + " not " + type(output).__name__)

        return output
    return decorated
...