首页 > 解决方案 > vars(A()) 返回一个空白字典

问题描述

假设快速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是实例方法,

vars([object]) 返回模块、类、实例或任何其他具有 dict 属性的对象的dict属性

另外,vars可以返回一个实例属性。

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

标签: python

解决方案


调用该函数会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'}

推荐阅读