Class 个已声明但未实例化的变量

Class variables declared but not instantiated

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

class MyClass():
    aa:int
    

这里发生了什么?在我看来,变量 aa 是一个已声明但未初始化的 class 变量。 :int 似乎是一个打字提示。我对么?我可以实例化 class 但我无法访问 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 并且它希望 sub类 使用 initialize 进行初始化,而不是覆盖 __init__。类型检查器可能会在这里抱怨 aa 是在 __init__ 之外创建的,因此访问起来不安全。 aa: int 注释明确指出 aa 应该随时作为 int 存在,因此可以安全访问(注意实际情况是 你的 责任)。例如,可以在 Tornado 中找到这种模式的示例。

这些注释的另一个用途当然是 类,这些注释在运行时明确使用,就像 Python 自己的 dataclasses 那样。