Python 自定义类型提示 from __future__ import annotations

作者 : admin 本文共968个字,预计阅读时间需要3分钟 发布时间: 2024-06-9 共3人阅读

Python 自定义类型提示 from __future__ import annotations

  • 正文
  • 方法1
  • 方法2
  • 方法3

正文

今天,遇到了一个比较有意思的问题,我自定义一个矢量类型,但是我想在它的方法中加入类型提示,但是遇到了错误,代码如下:

class Vector3D:
    def vec_dot(self, vec3d: Vector3D) :
        ...

在这里,vec_dot() 方法有一个参数,他也是一个我们正在定义的 Vector3D 类型。因此,我们想给它加上一个数据类型提示 Vector3D,但是上述代码运行时会提示我们。

Traceback (most recent call last):
  File "C:\Softwares\PythonProject\MathModel\Debug.py", line 13, in <module>
    class Vector3D:
  File "C:\Softwares\PythonProject\MathModel\Debug.py", line 14, in Vector3D
    def vec_dot(self, vec3d: Vector3D):
                             ^^^^^^^^
NameError: name 'Vector3D' is not defined

这是因为我们还未创建完成 Vector3D 类型,就已经开始了对它的引用。为了解决这一问题,我们提供三种方法。

方法1

class Vector3D:
    def vec_dot(self, vec3d: 'Vector3D'):
        ...

使用字符串对它进行标记说明。

方法2

使用字符串有个弊端,就是我们每次都需要多打一对字符串引用符号 ‘’。为了一劳永逸解决这个问题,可以在开头引入 __future__ 模块。

from __future__ import annotations


class Vector3D:
    def vec_dot(self, vec3d: Vector3D):
        ...

from __future__ import annotations 会自动将所有 hint 变为字符串的形式。

方法3

from typing import Self


class Vector3D:
    def vec_dot(self, vec3d: Self) -> float:
        ...

这里,我们使用 Self 类型对其进行说明,Self 类型即指代的是我们当前定义的 Vector3D 类型。

如果大家觉得有用,就请点个赞吧~

本站无任何商业行为
个人在线分享 » Python 自定义类型提示 from __future__ import annotations
E-->