Python:如何覆盖子类中实例属性的类型提示?

2024-01-02

在深入研究之前,我的问题是:如何在子类中使用类型提示来指定实例属性的不同类型?

如果您不清楚这意味着什么,请阅读下面的内容,我在其中起草了一个示例来澄清问题。


完整说明

我有一个抽象类Foo,以及一个子类Foo called SubclassOfFoo.

Foo有一个抽象方法get_something返回一个类型的对象Something.

Something有一个子类叫做SubclassOfSomething. SubclassOfSomething有一个额外的方法something_special.

SubclassOfFoo覆盖get_something返回类型的对象SubclassOfSomething。然后,SubclassOfFoo尝试使用SubclassOfSomething的方法something_special.

然而,目前我的 PyCharm 的检查正在报告Unresolved attribute reference 'something_special' for class 'Something'。我正在尝试找出解决此问题的正确方法。

这一切都非常令人困惑,所以我制作了一个很好的小代码片段来帮助这里:

from abc import ABC, abstractmethod


class Something:
    def __init__(self):
        self.attr = 0


class SubclassOfSomething(Something):
    def __init__(self):
        Something.__init__(self)

    def something_special(self):
        self.attr = 1


class Foo(ABC):
    def __init__(self):
        self.my_class = self.get_something()

    @abstractmethod
    def get_something(self) -> Something:
        pass


class SubclassOfFoo(Foo):
    def __init__(self):
        Foo.__init__(self)

    def get_something(self) -> SubclassOfSomething:
        return SubclassOfSomething()

    def do_something_special(self):
        self.my_class.something_special()

基本上,为了让一切顺利进行,我可以做以下几件事之一:

  1. 删除返回时的类型提示get_something within Foo
  2. 使用类型提示SubclassOfFoo for self.my_class把事情弄清楚
  3. 使用泛型?

选项 1. 是我试图避免的

选项2.不错,但我不明白

选项3.也是一个选项。

我也愿意接受其他选择,因为我确信有更好的方法。

你能帮我找出处理这个问题的正确方法吗?


我尝试过的

为了模拟选项 2.,我尝试使用typing.Type正如这里所建议的:类型提示中的子类 https://stackoverflow.com/questions/46092104/subclass-in-type-hinting

但是,这对我不起作用。


使用泛型:

from abc import ABC, abstractmethod
from typing import Generic, TypeVar


SomethingT = TypeVar('SomethingT', bound='Something')


...


class Foo(ABC, Generic[SomethingT]):
    my_class: SomethingT

    def __init__(self):
        self.my_class = self.get_something()

    @abstractmethod
    def get_something(self) -> SomethingT:
        pass


class SubclassOfFoo(Foo[SubclassOfSomething]):
    def __init__(self):
        super().__init__()

    def get_something(self) -> SubclassOfSomething:
        return SubclassOfSomething()

    def do_something_special(self):
        # inferred type of `self.my_class` will be `SubclassOfSomething`
        self.my_class.something_special()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python:如何覆盖子类中实例属性的类型提示? 的相关文章

随机推荐

  • Flutter 制作一个简单的 Ticket 小部件

    在颤振中我想剪辑可选部分Container制作这个小部件 剪切小部件 使其顶部和底部有两个半圆 对于这个剪辑小部件的某些功能 我想要一些可选功能 例如 剪裁该选项的顶部 底部以及右侧的空间 我怎样才能剪辑Container具有可选功能 您可
  • 如何过滤我的 lucene 搜索结果?

    说我的要求是 search for all users by name who are over 18 如果我使用 SQL 我可能会写这样的内容 Select from Users Where firstname like searchTe
  • postgresql 如何向用户授予执行模式中函数的权限

    我有一个名为schema func 我想授予执行权限schema func给用户 我尝试使用 GRANT EXECUTE ON schema func to my user 但它不起作用 当我执行此函数时 它会抛出错误 架构 ex 的权限被
  • 是否有用于在node-gyp中列出源的通配符机制

    我在写binding gyp我的新 node js 模块的文件 我的所有源文件都在下面src 子目录 我想在构建模块时使用所有这些 我不想每次添加新的 cpp 文件时都修改 binding gyp 而是想通过某种通配符机制列出所有 cpp
  • 登录 Rails 应用程序

    log4r 是正确记录 Rails 应用程序的好选择 日期时间 严重性 通知等 还是还有其他东西 将其放入 ruby 文件中 将该文件放入 lib 文件夹 约定 并从您的环境中 需要 它 require active support Log
  • 我可以让 Lucene 返回无限数量的搜索结果吗?

    我在 Java 5 环境中使用 Lucene 3 0 1 我一直在研究这个问题 但文档没有给出任何直接答案 使用搜索方法 TopFieldDocs search Weight weight Filter filter int nDocs S
  • Delphi - 在运行时创建 MySQL 数据库

    我有一个连接到 MySQL 数据库的 delphi 应用程序 但是 我想为我的最终用户创建一种简单的方法来实现 MySQL 数据库 我考虑在我的应用程序中创建一个按钮 用户可以按下该按钮来删除 scehma 的任何当前实例 并使用我的应用程
  • 如何在 Bokeh 中完成 `set_xlim` 或 `set_ylim` ?

    我在函数中创建一个图形 例如 import numpy from bokeh plotting import figure show output notebook output notebook def make fig rows col
  • 是什么导致 Android 13 设备上出现“getHistoricalRawPointerCoords:MotionEvent 的历史索引 1 无效”?

    以下崩溃很少见 但确实会发生在不同的设备上 libc so abort SIGABRT Thread getHistoricalRawPointerCoords Invalid historical index 1 for MotionEv
  • Excel VBA:如何从单元格值自动创建超链接?

    我有一个名为 Table1 的表 在 B 列中 我有票号 例如 76537434 要求 当B列中的任何单元格发生任何更改时 该单元格 目标单元格 将更改为超链接 使得超链接地址为example com id 76537434 单元格值 即
  • 确保已查看过的项目不会再次出现

    我对我试图解决的问题有一个可能的解决方案 但为了安全起见 我想在这里运行它 面临的挑战是确保在考试应用程序中完成某些测试问题的用户在后续测试中不会再次遇到这些问题 我没有使用 SQL 数据库 它允许我使用左连接 子查询 临时表等 我正在使用
  • MySQL中强制使用索引进行连接的语法是什么

    在进行直接选择时使用 FORCE USE IGNORE INDEX 已有详细记录 但文档中并不清楚如何在 JOIN 中执行此操作 如何强制将特定索引用于连接表 FORCE USE IGNORE 位于您要加入的表名之后 如果您使用的是别名 则
  • ASP MVC 和 WinForm 应用程序之间的通信

    我正在寻找一种用户可以在 ASP 和 Winform 应用程序之间进行通信的方法 我正在寻找像 soluto com 这样的东西 我想让用户通过网站向其他计算机发送命令 假设用户注册了 10 台计算机 并在 mvc 应用程序上注册 用户可以
  • 有没有办法用 C# 以编程方式发布 rdl 报告?

    我在 BI 中有一个解决方案文件 其中包含 10 个报表项目 每次更改时我都会手动发布这些项目 我想知道是否有解决方案以编程方式将这些项目部署在报表服务器上 是的 使用API 报告操作集合 http msdn microsoft com e
  • 如何使用java查找纪元格式的GMT当前时间

    我在下面编写了正在运行并给出输出的代码 但我不确定这是正确的 SimpleDateFormat sdf new SimpleDateFormat yyyy MM dd hh mm ss Date date new Date sdf setT
  • pandas 分类错误:“无法在具有新类别的分类上设置项目,请先设置类别”

    我在 pandas 中有以下 df 数据框 weekday venta total cy 0 Viernes 5 430211e 09 1 Lunes 3 425554e 09 2 Sabado 6 833202e 09 3 Domingo
  • 如何在谷歌应用程序引擎中创建常驻实例?

    我需要为常驻实例付费吗 现有的信息让我感到困惑 我想为我的 java 应用程序启用 永远在线 功能 谢谢 您确实需要为常驻实例付费 只需将最小空闲实例数设置为您想要的常驻实例数 3 类似于 始终开启 功能 应用程序 页面 您在其中进行设置
  • 错误 0x502 Android 模拟器

    我刚刚开始在 Android Studio 中使用mapbox 显示地图 当我启动模拟器时 不显示地图 只显示mapbox 徽标 我有这个错误 12 22 模拟器 android android emugl host libs Transl
  • Android 全宽 ICS 风格简约底部 ButtonsViews

    I want to make some buttons that look like this the following 我在 android widget 包中寻找预设的 ICS 非常努力 但我找不到任何 我认为必须有一个简单的方法 因
  • Python:如何覆盖子类中实例属性的类型提示?

    在深入研究之前 我的问题是 如何在子类中使用类型提示来指定实例属性的不同类型 如果您不清楚这意味着什么 请阅读下面的内容 我在其中起草了一个示例来澄清问题 完整说明 我有一个抽象类Foo 以及一个子类Foo called SubclassO