自省是通过一定的机制查询到对象的内部结构
__dict__
通过__dict__查询属性
class User:
name = "Y4tacker"
class Student(User):
def __init__(self, schoolname):
self.schoolname = schoolname
if __name__ == '__main__':
user = Student("aaa")
# `__dict__查询属性`
print(user.__dict__)
输出结果为{'schoolname': 'aaa'}
但如果我们再加上这样一个语句print(user.name)
居然把Y4tacker
打印了出来,这是为什么呢?
因为name
属于Person
这个类,类也是对象,name
是属于User
里的一个属性,并不是User
里的属性,在用.
这个符号访问的时候它会向上查询,这与之前所提到的MRO一致,只是实例在查询的时候,它会根据MRO的一个数据结构查询到User
而已,print(User.__dict__)
会打印
{'__module__': '__main__', 'name': 'Y4tacker', '__dict__': <attribute '__dict__' of 'User' objects>, '__weakref__': <attribute '__weakref__' of 'User' objects>, '__doc__': None}
,为啥会多这么多,因为User
是一个类,类比实例更加丰富
dir()
它会列出对象里的所有属性,只会打印出属性名称,而不显示属性的值