变量(A())返回空白字典

时间:2018-05-30 02:33:20

标签: python

假设快速class示例:

class A(object):
    def go(self):
        print("go A go!")
    def stop(self):
        print("stop A stop!")
    def pause(self):
        raise Exception("Not Implemented")

我试图比较A类和实例A()

的属性
In [67]: dir(A) == dir(A())
Out[67]: True

但是,使用vars

进行测试时
In [68]: vars(A) == vars(A())
Out[68]: False

In [73]: A.__dict__
Out[73]: 
mappingproxy({'__module__': '__main__',
              'go': <function __main__.A.go(self)>,
              'stop': <function __main__.A.stop(self)>,
              'pause': <function __main__.A.pause(self)>,
              '__dict__': <attribute '__dict__' of 'A' objects>,
              '__weakref__': <attribute '__weakref__' of 'A' objects>,
              '__doc__': None})

In [74]: A().__dict__
Out[74]: {}

很明显gostoppause是实例方法,

  

瓦尔([对象])   返回模块,类,实例 dict 属性,或具有 dict 属性的任何其他对象。

此外,vars可以返回实例属性。

A().__dict__返回空白字典的原因是什么。

2 个答案:

答案 0 :(得分:2)

调用函数vars(obj)会返回obj.__dict__中的属性。

另一方面,调用dir(obj)会尝试检索obj的有效属性列表,您可以使用getattr访问这些属性。

类主体中定义的方法是类的属性,而不是其实例的属性。这意味着它们存储在A.__dict__

class A:
    def bar(self):
        pass

print(A.__dict__)  # { ..., 'bar': <function Foo.bar at 0x000001D38ED218C8>, ... }
print(A().__dict__) # {}

虽然,如果您要手动或在__init__方法中设置实例的属性,那么它将由vars返回。

foo = A()
foo.baz = 'Python'

print(foo.__dict__) # {'baz': 'Python'}
print(vars(foo)) # {'baz': 'Python'}

答案 1 :(得分:0)

A是类,A()是实例。因此,当您执行A. dict 时,它会返回结构中的类定义,但是当您执行A()。 dict 时,它将返回分配的实例值属性