Скажем, у меня есть абстрактный класс:
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