Python 已声明但未实例化的类变量
我试图理解以下Python代码Python 已声明但未实例化的类变量,python,python-3.x,class,python-typing,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>&qu
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'
mm=MyClass()
嗯
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
嗯
AttributeError:“MyClass”对象没有属性“aa”
事实上,这只会为属性创建一个属性,而不会创建属性本身。属性和变量只是通过赋值创建的,这里没有赋值,所以它不存在(即使是隐式None
之类的)
如果属性在\uuuu init\uuuu
之外初始化,则此模式有助于满足类型检查器的要求,例如:
class MyClass(SomeParentClass):
aa: int
def initialize(self):
self.aa = 'foo'
假设SomeParentClass
将在其实例化过程中的某个定义点调用initialize
,它希望子类使用initialize
进行初始化,而不是重写\uuuuu init\uuuu
。类型检查器可能会在此处抱怨aa
是在\uuuu init\uuuu
之外创建的,因此访问不安全。aa:int
注释明确指出,aa
应该在任何时候都以int
的形式存在,因此访问是安全的(注意实际情况是您的责任)。例如,可以在中找到这种模式的示例
当然,这些注释的另一个用途是在运行时显式使用这些注释的类,就像Python自己的一样。您使用的Python的确切版本是什么?由conda forge打包的Python 3.8.6