Python 为什么在dir(Foo)API中不显示_uinit__;()方法中的属性?

Python 为什么在dir(Foo)API中不显示_uinit__;()方法中的属性?,python,Python,我无法理解为什么dir(Foo)不显示在init方法中定义的属性。我搜索并找到了所有答案。但仍然无法完全理解。 非常简单,a在调用\uuuu init\uuuu时创建。由于dir(Foo)不调用\uuuu init\uuuu,a永远不会被创建 换句话说,a是Foo实例的一部分,而不是Foo本身。没有Foo.a,只有Foo().a 在Python中,可以随时向用户定义的对象添加属性。或许以下几点会让事情变得更清楚: class Bar(object): pass bar = Bar()

我无法理解为什么dir(Foo)不显示在init方法中定义的属性。我搜索并找到了所有答案。但仍然无法完全理解。


非常简单,
a
在调用
\uuuu init\uuuu
时创建。由于
dir(Foo)
不调用
\uuuu init\uuuu
a
永远不会被创建

换句话说,
a
Foo
实例的一部分,而不是
Foo
本身。没有
Foo.a
,只有
Foo().a

在Python中,可以随时向用户定义的对象添加属性。或许以下几点会让事情变得更清楚:

class Bar(object):
    pass

bar = Bar()
print(dir(bar))
bar.a = 42
print(dir(bar))

您的示例不同的主要方式是,
a
恰好是在
\uuuu init\uuuu
调用期间创建的,而不是在调用之后创建的。

这是因为
a
仅在调用
\uu init\uu
之后定义。这是一个对象变量,特定于每个
Foo
对象<另一方面,代码>种类是在类名称空间中定义的,它是一个字段。这就是为什么当您
dir(Foo)
时,您不会看到
a
——它只列出属于该类的内容<另一方面,code>f是一个已经调用了
\uuu init\uuu
的对象,因此定义了它的
a

Foo
没有
a
属性。如果您想检查,请尝试
Foo.a
。@user2357112,谢谢您的快速回复,您是对的,Foo没有属性。但是,为什么?还有为什么f有这个属性。@d.m,因为
a
是实例属性,而不是类属性。
class Bar(object):
    pass

bar = Bar()
print(dir(bar))
bar.a = 42
print(dir(bar))