Я создал такой базовый класс
Код: Выделить всё
from abc import ABCMeta
class EGNode(metaclass = ABCMeta):
name: str
depends: type["EGNode"] = set()
def update_graph(graph: ErrorGraph) -> int:
return 0
Когда класс создается с помощью tENode, я надеюсь получить подкласс EGNode без дополнительного кодирования для наследования.
Более того, наследование должно быть распознаваемым при вводе текста и аннотациях.
Например, когда я создаю класс под названием Node с tENode, я надеюсь, что VSCode сможет распознать Node.update_graph(...) как статический метод EGNode.update_graph(...) и дать моим коллегам подсказки по связанному типу функции.
Что я пробовал
Подобный метакласс легко создать с неоднозначными аннотациями и типизацией, как и коды ниже
Код: Выделить всё
class tENode(Generic[T], ABCMeta): # just ignore the Generic
def __new__(cls, name, bases, dct):
if EGNode not in bases:
bases += (EGNode, )
return ABCMeta.__new__(cls, name, bases, dct)
Я также пытался решить эту проблему, добавив type[EGNode] в качестве родительского класса tENode, но не удалось.
Возможные решения и дополнительные требования
- Метакласс неизбежен в моем проекте. Причина в том, что tENode[...] используется как «подкласс» типа [EGNode] чья родовая часть () может сообщать тип возвращаемого значения переопределенного EGNode.update_graph(...) в моем дальнейшем кодировании (возвращенное int приведено только в качестве примера).
Код: Выделить всё
[...]
- Возможным решением может быть вложенный класс, а вложение EGNode в tENode допустимо.
- Нет проверок например, mypy будет использоваться, типизация и аннотации в проекте предназначены только для подсказок в IDE, например VSCode.
Подробнее здесь: https://stackoverflow.com/questions/791 ... ass-of-spe