Есть ли какая-нибудь концепция, в которой я могу комбинировать дженерики и описывать отношения между классами и экземплярами этого класса?

Немного надуманный пример, но он передает мою точку зрения:

ManagedClass = TypeVar("ManagedClass")


class MyClass1:
   def my_method(self):
      ...


def instantiate_class(cls: ManagedClass, *args, **kwargs) -> ManagedClass:
    return cls(*args, **kwargs)

myclass1 = instantiate_class(MyClass1)

myclass1.my_method()  # IDE Warning: Parameter 'self' unfulfilled

Предупреждение очевидно правильное, но не то, что мне нужно.

Есть ли способ предоставить эту концепцию средствам проверки типов, где тип ввода - это класс, а тип возвращаемого значения - экземпляр этого класса?

2
Adam Clark 3 Май 2021 в 03:00

1 ответ

Лучший ответ

Вам нужно что-то вроде этого:

def instantiate_class(cls: Type[ManagedClass], *args, **kwargs) -> ManagedClass:
    ...

Для дальнейшей иллюстрации:

# Type an instance of a class:
foo: Foo = Foo()

# Type a class itself:
foo: Type[Foo] = Foo
3
flakes 3 Май 2021 в 00:06