Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 已声明但未实例化的类变量_Python_Python 3.x_Class_Python Typing - Fatal编程技术网

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

我试图理解以下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'
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