mypy 列表中对象继承的问题

2023-11-22

Python 3.6.5 和 mypy 0.600

我写了代码:

from typing import List


class Animal():
    pass


class Dog(Animal):
    def __init__(self) -> None:
        super()

    def bark(self) -> None:
        pass


class Cat(Animal):
    def __init__(self) -> None:
        super()

    def meow(self) -> None:
        pass


arr1: List[Dog] = [Dog(), Dog()]
arr2: List[Animal] = [Dog(), Dog()]

# error: Incompatible types in assignment (expression has type "List[Dog]", variable has type "List[Animal]")
arr3: List[Animal] = arr1

我不明白,为什么我有一个错误“赋值中的类型不兼容”和变量“arr3”。 Dog 是一个继承自 Animal 的类。 例如,变量“arr2”没有错误。


想象一下这是可能的:

arr3: List[Animal] = arr1

现在你认为你有动物列表,但这实际上是狗列表(请注意arr3不是副本arr1, 他们是the same list).

因为您认为这是动物列表,所以您可以添加Cat to it.

但是,因为这实际上是狗的列表,所以您不能添加Cat到它。否则你会失败AttributeError在尝试使用狗特定的属性后。

更一般地说,列表是不变的 -List[Animal]不能分配给List[Dog](因为它已经可以包含猫)并且List[Dog]不能分配给List[Animal](因为你可以稍后添加猫)


这在Python中可能不明显,但你可以做简单的测试:

arr3: List[Animal] = arr1 
arr3.append(Cat())
for dog in arr1:
    print(dog.bark())

Mypy 不允许这样做,因为此分配可能会破坏您的代码逻辑

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

mypy 列表中对象继承的问题 的相关文章

随机推荐

  • 使用 == 比较 numpy 数组的规则是什么?

    例如 尝试理解这些结果 gt gt gt x array 0 1 2 3 4 5 6 7 8 9 gt gt gt x np array 1 2 astype np float32 array 0 1 0 0 0 0 0 0 0 0 0 0
  • npm run 分段错误:11

    我正在尝试 npm run HOT 1 node node modules bin react native webpack server start hot 收到此错误 gt email protected hot Users user
  • Chartkick 柱形图多种颜色

    我在用着图表踢在我的 RoR 项目中生成图表 效果非常好 与谷歌图表一起 我创建了一个柱形图 with 只有 2 个酒吧 男性和女性 现在客户希望每个条形都有不同的颜色 那可能吗 我看过这个帖子 如何更改使用 Chartkick 创建的柱形
  • 如何显示 bash 会话的当前进程树?

    我想创建一个 bash 别名 它为我提供从我正在使用的当前 bash 会话到 init 的进程树 用例是为了知道我是否使用过bash or vi s shell命令 我正在使用 MacOS X 我听说过pstree 但是好像只显示子进程 而
  • 在 Typescript 中向数组添加属性

    我正在尝试向 Typescript 中的 Array 对象添加一个方法 我已经在 SO 上找到了其他解决方案 但这些解决方案都不适合我 我的代码如下所示 interface Array average gt number Array pro
  • 需要根据元素升序将列表划分为列表(Haskell)

    假设我有这样的列表 4 5 6 7 1 2 3 4 5 6 1 2 我需要一个 Haskell 函数来将该列表转换为一个列表列表 该列表由原始列表的片段组成 这些片段按升序形成一系列 所以结果应该是这样的 4 5 6 7 1 2 3 4 5
  • 在不可变类中,为什么字段被标记为私有?

    创建不可变类时将字段设为私有有什么好处 我见过为什么在创建不可变类时 字段被声明为私有 但我没有从这篇文章中理解任何内容 有人可以向我解释一下吗 最好的解释方法是举个例子 public class Immutable private fin
  • 如何使用 WMI 和 Python 弹出 CD?

    使用 Windows 的 WMI 库 如何弹出安装在特定 CD DVD 驱动器中的 CD ROM 由于我在 Python 上使用 wmi py 库 因此我要求获取 WMI 文档或示例的源代码 如果解决方案能够满足比 Windows 2000
  • scala - 将超过22个元素的json解析为案例类

    这个问题或类似的问题之前曾发布过 但是没有一个解决方案适用于最新的库 经过广泛的搜索 到目前为止 我没有发现任何证据表明最流行的库的最新版本spray json or play json 或其插件 可以处理这种情况 有没有什么东西可以将超过
  • 为什么java内部函数仍然有代码?

    Java API 中有许多方法是内在函数 但在查看源代码时仍然具有与其关联的代码 例如 Integer bitCount 是一个内在函数 但如果您打开 Integer 类文件 您可以看到包含它的代码 如果编译器 jvm 不一定使用该代码 那
  • 先验算法

    我之前曾多次听说过 Apriori 算法 但从未有时间或机会深入研究它 有人可以用简单的方式向我解释该算法的工作原理吗 另外 一个基本的例子会让我更容易理解 先验算法 它是一种用于数据集中频繁模式挖掘的候选生成和测试方法 有两件事你必须记住
  • 如何在 tmap 中定位标题和图例?

    我是编程新手 目前正在参加使用 R 的空间分析入门课程 以下代码生成下面包含的 tmap 如何将每个 tmap 的标题居中并将图例放置在右上角 而不将其放在地图本身之上 非常感谢你的协助 ga1 tm shape a2georgia tm
  • 为什么 Babel 7 对浏览器使用 require() 函数,而浏览器对此一无所知?

    我尝试在我的模块中使用 d3 js 我使用 Babel 7 来转译我的代码源 这是我的package json name d3 learning version 1 0 0 description main index js directo
  • D8045:无法使用 /clr 选项编译 C 文件“serialcommands.c”

    我收到编译器错误 D8045 无法使用 clr 选项编译 C 文件 serialcommands c 该文件是一个 C 库 编写用于通过串行端口与 TI 处理器进行通信 我需要做的任务是用 CLR 包装器包装这个库 如果您想从 CLI 问题
  • 使用 axwindowsMediaPlayer 创建播放列表时发生灾难性失败(HRESULT 异常:0x8000FFFF)

    我正在使用 axwindowsMediaPlayer 对象在 winform 中显示视频 我特别想播放一个播放列表 在我的电脑 win7 上一切正常 并且在另一台装有 winXP 的电脑 最终用户的电脑 上也可以正常工作 但几天前发生了一些
  • Bokeh 工具在 QWebView 中不起作用

    下午好 经过多年的阅读 第一次在 stackoverflow 上发帖 令人兴奋 我使用 bokeh 生成 html 代码 并将其输入到一个非常简单的 PyQt4 GUI 中的 QWebView 中 散景图顶部的标准工具在 QWebView
  • asp.net-mvc 中的缓存

    我想在我的 asp net mvc 站点中缓存最繁重的数据库操作 在我的研究中我发现 甜甜圈缓存在菲尔的博客上 缓存 压缩Kazi 博客上的过滤器 Scott Hansleman 的播客介绍了他们如何在 SO 中缓存内容 但我觉得我还没明白
  • 对基类模板成员函数的不明确访问

    在 Visual Studio 2008 中 编译器无法解析对SetCustomer in tmain下面并使其明确 template
  • Windows 中的 Rake 测试非常慢

    为什么 Ruby 和 Ruby on Rails 1 8 6 一键安装程序 本地数据库 在 Windows 上运行如此缓慢 ruby 脚本 服务器 30 秒 耙子测试 45 秒 etc 然而 当我跳到一个慢得多的 Linux 机器上时 它几
  • mypy 列表中对象继承的问题

    Python 3 6 5 和 mypy 0 600 我写了代码 from typing import List class Animal pass class Dog Animal def init self gt None super d