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
那样。
我正在尝试理解以下 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
那样。