在类中使用类型提示
在类中使用类型提示
这个问题已经在这里有了答案:
class Node: def append_child(self, node: Node): if node != None: self.first_child = node self.child_nodes += [node]
我该怎么做node: Node
?因为当我运行它时,它会显示name \'Node\' is not defined
。
我应该直接删除:Node
并在函数内部进行实例检查吗?
但是然后我怎么能访问node
的属性(我期望它们是Node
类的实例)?
我不知道如何在Python中实现类型转换,顺便说一下。
Python 3.7和Python 3.10以后
PEP 563引入了延迟计算,作为字符串存储在__annotations__
中。用户可以通过__future__
指令启用此功能:
from __future__ import annotations
这使得可以编写如下代码:
class C: a: C def foo(self, b: C): ...
从Python 3.10开始(预计在2021-10-04发布),此行为将成为默认行为。
编辑于2020-11-15:最初宣布的是从Python 4.0开始强制执行,但现在看来这将成为Python 3.10的默认行为,预计将于2021-10-04推出。这让我感到惊讶,因为这似乎违反了__future__
的承诺,即不会在Python 4.0之前破坏此向后兼容性。也许开发人员认为3.10即为4.0,或者他们已经改变了想法。另请参见为什么__future__的注释引导语的强制发行在3.7和3.8之间发生了变化?。
"self"引用在类型检查中通常使用字符串进行:
class Node: def append_child(self, node: 'Node'): if node != None: self.first_child = node self.child_nodes += [node]
这在PEP-0484的“Forward references”部分中有描述。
请注意,这并不进行任何类型检查或强制转换。这只是一个类型提示,Python(通常)完全忽略它。然而,第三方工具(例如mypy)使用类型提示对您的代码进行静态分析,并可以在运行时之前生成错误。
另外,从python3.7开始,您可以通过使用from __future__ import annotations
(在python4.0中,这将是默认值)在模块中隐式将所有类型提示转换为字符串。
1提示是可内省的 - 如果您真的想要这样做,您可以使用装饰器或类似的方法构建某种运行时检查器,但Python默认不这样做。