python - 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]: {}
很明显go
,stop
和pause
是实例方法,
vars([object]) 返回模块、类、实例或任何其他具有 dict 属性的对象的dict属性。
另外,vars
可以返回一个实例属性。
A().__dict__
返回空白字典的原因是什么。
解决方案
调用该函数会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'}