首页 > 解决方案 > 为什么 __init__() 方法中的属性不显示在 dir(Foo) API 中?

问题描述

我无法理解为什么 dir(Foo) 不显示在init方法中定义的属性。我搜索并找到了 Kindall 答案。但仍然无法完全理解。 Python dir(dict) 与 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']

标签: python

解决方案


很简单,在被调用a时被创建__init__。由于dir(Foo)不调用__init__,因此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恰好在__init__调用期间而不是在调用之后创建。


推荐阅读