python类中的方法可以用子类定义的类型注释吗?

用户名

我有一个超类,它具有一个由其子类共享的方法。但是,此方法应返回具有在子类上定义的类型的对象。我希望方法的返回类型是静态注释的(不是动态类型),因此使用子类的代码可以从mypy返回值的类型检查中受益但是我不想仅仅为了提供其类型注释而在子类上重新定义通用方法。python类型注释和mypy是否可能?

像这样:

from typing import Type

class AbstractModel:
    pass

class OrderModel(AbstractModel):
    def do_order_stuff():
        pass

class AbstractRepository:
    model: Type[AbstractModel]

    def get(self) -> model:
        return self.model()

class OrderRepository(AbstractRepository):
    model = OrderModel


repo = OrderRepository()
order = repo.get()

# Type checkers (like mypy) should recognize that this is valid
order.do_order_stuff()

# Type checkers should complain about this; because `OrderModel`
# does not define `foo`
order.foo()

棘手的动作是get()在超类上定义的AbstractRepository,它尚不知道的类型model(并且-> model注释失败,因为model尚未指定的值)。

的值model由子类指定,但子类并未(重新)定义get()以提供注释。看来这应该是静态可分析的;尽管这有些棘手,但因为它需要静态分析器才能跟踪model从超类到子类引用。

有什么办法可以实现共享的超类实现和精确的子类返回类型?

切普纳

定义AbstractRepository为通用类。

from typing import TypeVar, Generic, Type, ClassVar


T = TypeVar('T')

class AbstractRespotitory(Generic[T]):
    model: ClassVar[Type[T]]

    @classmethod
    def get(cls) -> T:
        return cls.model()

get仅使用class属性,因此可以并且可以说应该是class方法。)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

我可以用通用形式声明一个类,然后将子类转换为在Java中声明为通用的类型吗?

来自分类Dev

可以用模板替换类类型信息宏吗?

来自分类Dev

有什么方法可以用python清除图像吗?

来自分类Dev

为什么可以用未定义路径依赖的类型定义一个类?

来自分类Dev

子类中的方法可以重载超类中的方法吗?

来自分类Dev

Python:对于超类中定义的运算符,我可以有一个子类返回其自身类型的实例吗?

来自分类Dev

我们可以用C#中的带有默认方法的接口替换抽象类吗

来自分类Dev

我们可以用C ++中的非模板类“包装”模板类吗?

来自分类Dev

子类可以在 Python 中与父类分开的文件中吗?

来自分类Dev

子类可以从 Python 中的父类继承实例变量吗?

来自分类Dev

我可以用类型替换SLAB每事件一个方法吗?

来自分类Dev

FXMLLoader工厂方法可以用于用户定义的类吗?

来自分类Dev

可以将注释目标限制为某个类的子类吗?

来自分类Dev

我可以用此类中的嵌套类填充模板参数吗?

来自分类Dev

您可以用另一个基类覆盖基类中的一个抽象方法吗?

来自分类Dev

Jena RdfDataMgr可以用类型文字写乌龟吗

来自分类Dev

匿名类可以用 lambda 代替吗?

来自分类Dev

为类型类的子类定义方法

来自分类Dev

为类型类的子类定义方法

来自分类Dev

我可以在Object Pascal的类中定义类型吗?

来自分类Dev

Java-是否可以用单个类扩展类的所有子类?

来自分类Dev

Python 3的基类类型的注释只允许当前子类

来自分类Dev

有什么方法可以用 DOM 中不存在的 JS 选择 CSS 类?

来自分类Dev

子类awakeFromNib可以调用超类自定义init / setup方法吗?

来自分类Dev

有没有一种方法可以用注释在多行中编写熊猫SQL查询?

来自分类Dev

根据Java中的子类类型定义父类方法的泛型类型

来自分类Dev

TypeScript子类:如何设置父类中定义的方法的参数类型和返回类型

来自分类Dev

可以用约束'{}'的其他子类型实例化打字稿错误

来自分类Dev

指针上定义的方法仍然可以用值调用

Related 相关文章

  1. 1

    我可以用通用形式声明一个类,然后将子类转换为在Java中声明为通用的类型吗?

  2. 2

    可以用模板替换类类型信息宏吗?

  3. 3

    有什么方法可以用python清除图像吗?

  4. 4

    为什么可以用未定义路径依赖的类型定义一个类?

  5. 5

    子类中的方法可以重载超类中的方法吗?

  6. 6

    Python:对于超类中定义的运算符,我可以有一个子类返回其自身类型的实例吗?

  7. 7

    我们可以用C#中的带有默认方法的接口替换抽象类吗

  8. 8

    我们可以用C ++中的非模板类“包装”模板类吗?

  9. 9

    子类可以在 Python 中与父类分开的文件中吗?

  10. 10

    子类可以从 Python 中的父类继承实例变量吗?

  11. 11

    我可以用类型替换SLAB每事件一个方法吗?

  12. 12

    FXMLLoader工厂方法可以用于用户定义的类吗?

  13. 13

    可以将注释目标限制为某个类的子类吗?

  14. 14

    我可以用此类中的嵌套类填充模板参数吗?

  15. 15

    您可以用另一个基类覆盖基类中的一个抽象方法吗?

  16. 16

    Jena RdfDataMgr可以用类型文字写乌龟吗

  17. 17

    匿名类可以用 lambda 代替吗?

  18. 18

    为类型类的子类定义方法

  19. 19

    为类型类的子类定义方法

  20. 20

    我可以在Object Pascal的类中定义类型吗?

  21. 21

    Java-是否可以用单个类扩展类的所有子类?

  22. 22

    Python 3的基类类型的注释只允许当前子类

  23. 23

    有什么方法可以用 DOM 中不存在的 JS 选择 CSS 类?

  24. 24

    子类awakeFromNib可以调用超类自定义init / setup方法吗?

  25. 25

    有没有一种方法可以用注释在多行中编写熊猫SQL查询?

  26. 26

    根据Java中的子类类型定义父类方法的泛型类型

  27. 27

    TypeScript子类:如何设置父类中定义的方法的参数类型和返回类型

  28. 28

    可以用约束'{}'的其他子类型实例化打字稿错误

  29. 29

    指针上定义的方法仍然可以用值调用

热门标签

归档