正常情況下,當我們定義了一個class,創建了一個class的實例后,我們可以給該實例綁定任何屬性和方法,這就是動態語言的靈活性。
看下面一種常見的get/set操作
In [174]: class Student(object): .....: pass .....: In [175]: s = Student() In [176]: s.name = 'alex' In [177]: print(s.name) alex
它的動態屬性是怎么來的呢?其實,它真正的過程是這樣的
In [178]: class Student(object): .....: pass .....: In [179]: s = Student() In [180]: s.__setattr__("name","alex") In [181]: s.__getattribute__("name") Out[181]: 'alex'
由此可見,__setattr__與__getattribute__方法才是實例獲得動態屬性的真正原因。