【问题标题】:__init__(self) -> None: vs __init__(self): in python [duplicate]__init__(self) -> None: vs __init__(self): in python [重复]
【发布时间】:2020-09-25 22:57:35
【问题描述】:

1) __init__(self) -> None: 和 2) __init__(self): 有什么区别?

class A:
    def __init__(self) -> None:
        self.a = 5

class B:
    def __init__(self):
        self.a = 5

print (" A : ", A().a)
print (" B : ", B().a)

【问题讨论】:

  • 在运行时,什么都没有。类型提示仅供外部工具使用。
  • -> None 语法是打字机制的一个例子。它说__init__ 方法返回None__init__ 方法本身也是如此,即使在创建类实例时调用新的类实例也是如此。您可以阅读有关打字系统here 的信息。 Python 运行时环境不强制执行类型信息,因此您可以将它们视为具有定义语法的专用 cmets。
  • @chepner 和“Tom Karzes,非常感谢您的回复,我明白了。我现在明白了。

标签: python


【解决方案1】:

-> None 部分是类型提示。它是在 PEP 484 中引入的。你可以阅读更多关于它的信息here。您展示的两种__init__ 方法在运行时中是等效的。类型检查器可以使用类型提示,例如 mypyPyright

这篇mypy 文档完美地总结了它:

由于 mypy 是一个静态分析器或类似 lint 的工具,因此类型注释只是 mypy 的提示,在运行程序时不会干扰。您使用标准 Python 解释器运行程序,并且注释被有效地视为 cmets。

这也是 PEP 484 的一个有趣部分,它解释了将 -> None 放入 __init__ 方法的基本原理。

(请注意,init 的返回类型应该用 -> None 进行注释。这样做的原因很微妙。如果 init 假设返回注释为 ->没有,这是否意味着无参数、无注释的 init 方法仍应进行类型检查?与其留下歧义或在异常中引入异常,我们只是说 init 应该有一个返回注解;因此默认行为与其他方法相同。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-04
    • 2019-05-08
    • 2022-12-08
    • 2014-06-11
    • 1970-01-01
    • 2015-11-04
    • 2020-02-04
    • 2010-10-12
    相关资源
    最近更新 更多