自省是通過一定的機制查詢到對象的內部結構
__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()
它會列出對象裏的所有屬性,只會打印出屬性名稱,而不顯示屬性的值