假设快速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
是实例方法,
瓦尔([对象]) 返回模块,类,实例的 dict 属性,或具有 dict 属性的任何其他对象。
此外,vars
可以返回实例属性。
A().__dict__
返回空白字典的原因是什么。
答案 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 时,它将返回分配的实例值属性