python - 已声明但未实例化的类变量

标签 python python-3.x class python-typing

我正在尝试理解以下 Python 代码

class MyClass():
    aa:int
    

这里发生了什么?在我看来,变量 aa是一个已声明但未初始化的类变量。 :int似乎是打字提示。我对么?我可以实例化该类,但无法访问 aa 。这让我觉得我的理解是错误的。见下文

 mm = MyClass()
 mm.aa
Traceback (most recent call last):

  File "<ipython-input-15-cfce603dd5e0>", line 1, in <module>
    mm.aa

AttributeError: 'MyClass' object has no attribute 'aa'

最佳答案

事实上,这只会创建一个 annotation对于属性,它不会创建属性本身。属性和变量仅通过赋值创建,并且此处未分配任何内容,因此它不存在(即使使用隐式 None 等也不存在)。

如果属性是在 __init__ 之外初始化的,则此模式对于满足类型检查器很有用,例如:

class MyClass(SomeParentClass):
    aa: int

    def initialize(self):
        self.aa = 'foo'

假设 SomeParentClass 将在实例化过程中的某个定义点调用 initialize,并且它希望子类使用 initialize 进行初始化,而不是覆盖 __init__。类型检查器可能会在这里提示 aa 是在 __init__ 之外创建的,因此访问不安全。 aa: int 注释明确表示 aa 应该随时以 int 形式存在,因此可以安全访问(注意那么实际上的情况就是的责任)。这种模式的示例可以在 Tornado 中找到。 ,例如。

当然,这些注释的另一个用途是在运行时显式使用这些注释的类,例如 Python 自己的 dataclasses做。

关于python - 已声明但未实例化的类变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64798920/

相关文章:

javascript - 如何在 ES6 中使用私有(private)变量?

ruby - 您是否曾在任何 Ruby 代码中使用过 "class instance variable"?

python - 展平 2D 数组 1D Sum

python - 在 IPython Widgets 中,如何用新值更新 DropDown 小部件?

python - 如何通过 Pycharm 在 Python 中使用调试器进行单元测试?

python - 使用重复条件过滤 Python 中的行

python - 如何确定 Python 2.7.5 中的 interned 字符串数?

python - UML 类图 : What goes in the return type for the function if the function returns a function call?

Python - Folium map 不显示标记

c++ - 为什么不首先将类(class)成员设置为公开?