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