当前位置: 首页 > 知识库问答 >
问题:

类型化python:在类定义中使用类自己的类型[duplicate]

史良哲
2023-03-14

以下代码不能按预期工作。显然,我不能在类定义中使用类自己的类型:

class Foo:
    def __init__(self, key :str) -> None:
        self.key = key

    def __eq__(self, other :Foo) -> bool:
        return self.key == other.key

print('should be true: ', Foo('abc') == Foo('abc'))
print('should be false: ', Foo('abc') == Foo('def'))

运行它的结果是:

Traceback (most recent call last):
  File "class_own_type.py", line 1, in <module>
    class Foo:
  File "class_own_type.py", line 5, in Foo
    def __eq__(self, other :Foo) -> bool:
NameError: name 'Foo' is not defined

此外,使用mypy检查代码会返回:

class_own_type.py:5: error: Argument 1 of "__eq__" incompatible with supertype "object"

如何将此代码更正为对Python和mypy有效?

共有1个答案

松雅健
2023-03-14

名称Foo尚未绑定,因为在尝试使用该名称时,类本身尚未定义(请记住:函数参数是在函数定义时计算的,而不是在函数调用时计算的)。

在Python 3.7中,您可以通过在模块顶部添加此导入来推迟注释的评估:

from __future__ import annotations

在Python 3.10中,延迟求值将成为默认行为。对于Python

class Foo:
    def __init__(self, key :str) -> None:
        self.key = key

    def __eq__(self, other: 'Foo') -> bool:
        return self.key == other.key

print('should be true: ', Foo('abc') == Foo('abc'))
print('should be false: ', Foo('abc') == Foo('def'))
 类似资料:
  • Rust 自定义数据类型主要是通过下面这两个关键字来创建: struct: 定义一个结构体 enum: 定义一个枚举类型 而常量的创建可以通过 const 和 static 关键字来创建。

  • 存在多种方法来重新定义现有类型的行为以及提供新的类型。 重写类型编译 一个常见的需求是强制更改类型的“字符串”版本,即在create table语句或其他SQL函数(如cast)中呈现的版本。例如,应用程序可能希望强制呈现 BINARY 适用于除一个平台外的所有平台 BLOB 待渲染。在本例中,使用现有的泛型类型 LargeBinary ,是大多数用例的首选。但是为了更准确地控制类型,每个方言的编

  • 1. 包含头文件 #import <AdHubSDK/AdHubSDK.h> 2. AdHubCustomView 的创建和初始化 在需要导入广告的ViewController头文件中导入头文件并声明实例以及声明代理 #import <AdHubSDK/AdHubSDK.h> @interface AdHubCustomViewController ()<AdHubCustomViewDele

  • 在尝试在其他地方发布的建议后,我发现自己无法运行使用非类型化 NPM 模块的打字稿项目。下面是一个最小示例和我尝试过的步骤。 对于这个最小的例子,我们将假设 没有现有的类型定义。因此,我们将忽略包 ,并尝试手动将其类型文件 添加到我们的项目中。 文件夹结构 < li >节点模块 < ul > < li>lodash < li>foo.ts 自定义 洛达什.d.ts 接下来是文件。 文件 文件直接从

  • 如何将此迭代器与泛型类型一起使用?以下是我在“main”函数中尝试的方法: 结果是:<代码>无法从静态上下文引用非静态类项 结果是:<代码>无法从静态上下文引用非静态类项 结果: 编辑: 我调用的是类而不是方法。这项工作: 迭代器it=deq。迭代器(); 我认为,由于iterator()中返回的实例的类型是ListIterator,因此我需要使用该类型声明“it”。

  • 我在我的wordpress网站上创建了一个自定义帖子类型“Portfolio”,还为这个自定义帖子类型创建了一个类别部分,其中包含类别slug“PortCate”。 “Portfolio”帖子的永久链接如下: mysite.com/portfolio/post-name/ 但是类别url是 mysite.com/port-cate/category-slug/ 我的问题是:如何为这种帖子类型创建分