我不明白为什么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']
答案 0 :(得分:1)
很简单,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__
调用期间创建的,而不是在调用之后创建的。
答案 1 :(得分:1)
这是因为仅在之后 a
被调用后定义了__init__
。这是一个对象变量,特定于每个Foo
对象。另一方面,kind
是在类名称空间中定义的,它是一个 class 字段。这就是为什么当您dir(Foo)
时看不到a
的原因-它仅列出属于该类的内容。另一方面,f
是一个已经调用过__init__
的对象,因此定义了它的a
。