在类中使用类型提示

13 浏览
0 Comments

在类中使用类型提示

这个问题已经在这里有了答案

如何使用包含类的类型来类型提示一个方法?

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中实现类型转换,顺便说一下。

admin 更改状态以发布 2023年5月23日
0
0 Comments

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之间发生了变化?

0
0 Comments

"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默认不这样做。

0