为什么__init __()方法中的属性未显示在dir(Foo)API中?

时间:2018-12-25 07:30:03

标签: python

我不明白为什么dir(Foo)不显示 init 方法中定义的属性。我搜索并找到了Kindall的答案。但仍然无法完全理解。 Python dir(dict) vs dir(dict.__class__)

class Foo(object):
    kind = 'car'
    def __init__(self, a):
        self.a = a

    def bar(self, b):
        return self.a + b

f = Foo(1)
print(dir(Foo))  #['bar','kind']
print(dir(f))    #['a','bar','kind']

2 个答案:

答案 0 :(得分:1)

很简单,a是在调用__init__时创建的。由于dir(Foo)不会调用__init__,因此a永远不会被创建。

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

在Python中,可以随时将属性添加到用户定义的对象。也许以下将使事情变得更清楚:

class Bar(object):
    pass

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

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

答案 1 :(得分:1)

这是因为仅在之后 a被调用后定义了__init__。这是一个对象变量,特定于每个Foo 对象。另一方面,kind是在类名称空间中定义的,它是一个 class 字段。这就是为什么当您dir(Foo)时看不到a的原因-它仅列出属于该类的内容。另一方面,f是一个已经调用过__init__的对象,因此定义了它的a