正常情况下,当定义了一个 class
,创建了一个 class
的实例后,
可以给该实例绑定任何属性和方法,这就是动态语言的灵活性。
看下面一种常见的 get/set
操作。
class Student(object):
pass
s = Student()
s.name = 'alex'
print(s.name)
alex
它的动态属性是怎么来的呢?其实,它真正的过程是这样的。
class Student(object):
pass
s = Student()
s.__setattr__("name","alex")
s.__getattribute__("name")
'alex'
由此可见,__setattr__
与 __getattribute__
方法才是实例获得动态属性的真正原因。