python在语言设计上比较灵活,属于动态语言。
之前不知道这动态语言的意思,感觉很新奇,就看了下python的文档。
该文9万字,论述了python的乾坤,balabala 很多。
其中 对象可以添加或删除 对象属性和方法 的操作就是 动态语言 的表现了。
这样 python 相对来说对类型的操作就比较方便了。
__get__
、__getattribute__
、__getattr__
拦截顺序这篇博客中介绍了 通过 属性名 来获取 属性的 方法。
实例引用:
class Account(object): def __get__(self, instance, owner): print('作为别人小弟(类属性)被访问时,无条件经过我') return self def __getattribute__(self, item): print('访问属性时,无条件经过我') return object.__getattribute__(self, item) name = 'xiaomi' def __getattr__(self, item): print('我只负责捡漏') if item == 'product': return 'cellphone' class User: name = 'Lucy' account = Account() if __name__ == '__main__': u = User() p = u.account.product print(p) ## Output: ## 作为别人小弟(类属性)被访问时,无条件经过我(u.account触发) ## 访问属性时,无条件经过我(u.account.product触发) ## 我只负责捡漏(u.account.product触发) ## cellphone
这个实例比较形象,平时我们在访问不存在的实例的时候,就会被抛错,并且不友好的退出。
我们可以使用 __getattr__
来做容错处理。
另外 我们还可以通过 __setattr__
来添加或者赋值对应属性:
u.__setattr__('bb', 'ccc')
使用字典的方式来,查看所有属性及其值。
print(u.__dict__)
解锁了这个 python
技能,以后使用 python
对象就更加灵活了!