今天早些时候,我偶然发现了一个我无法完全理解的Python类的行为。
如果我们使用这段代码:
class A:
a: str
当我测试a
的属性访问时,比如A.a
甚至A().a
,我得到一个AttributeError: type object 'A' has no attribute 'a'
。
相反,如果我只给予A.a
一个值:
class A:
a: str = 'attribute a'
然后我可以用A.a. # returns "attribute a"
访问它。
我不完全理解为什么第一个案例引发了AttributeError
。
3条答案
按热度按时间zf2sa74q1#
在第一种情况下,您告诉类型检查器将有一个名为
a
的str
类型的属性,但您没有设置它。在第二种情况下,实际上是给
a
一个值hlswsv352#
在Python中,类的属性不是自动定义的。当你用属性“a”创建类“A”时,你声明了有一个新的数据类型“A”,它将有一个值,我将把它称为“a”。你还没有说这个值是什么。
在第二个代码段中,您将'attribute a'的默认值设置为A.a,因此如果您要创建A的示例而不定义a,则它将默认为您的输入。
然而,第一个片段仍然有效。你只需要创建一个类的示例,如下所示:
kcrjzv8t3#
你不是在声明一个变量,你只是在暗示变量的类型。Python在这里不创建变量。这就是为什么你面对错误。
在这里,您创建了一个属性,并为其分配了一个值= 'attribute a'。
因此类型提示不会影响代码的运行时行为。实际属性声明需要赋值