正文
今天,遇到了一个比较有意思的问题,我自定义一个矢量类型,但是我想在它的方法中加入类型提示,但是遇到了错误,代码如下:
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
但是需要注意,这里有一个问题,就是如果我们想要使用 Vector3D
用作提示字符串的话,首先我们需要有一个自定义的 Vector3D
类,如果没有这个自定义类,使用 Vector3D
作为提示字符串时就会报错。对于类的指代,通常我们用的是小写的 self
,但是当用作类型提示时,我们需要使用大写的 Self
,这个特定的提示字符串存在放 typing
中,类似的还有 dict -> Dict
等等。
from typing import Self
class Vector3D:
def vec_dot(self, vec3d: Self) -> float:
...
这里,我们使用 Self
类型对其进行说明,Self
类型即指代的是我们当前定义的 Vector3D
类型。
综合使用上述介绍的方法,我们就可以实现 Python
代码中提示字符串的合理书写,从而增加代码的可读性。
如果大家觉得有用,就请点个赞吧~