python 对象属性的访问

阅读了fluent python的metaprogramming这一大章节,下面对阅读后产生的感想做一下总结。

 

首先是关于对象 属性 访问的4个protocol

按照理解可以划分为

__getattribute__         

__getattr__        __setattr__      __delattr__

这样划分是因为  __getattribute__   方法只有在对象有该属性时,需要get 对象的某个属性值时,才会执行该方法,可以将这个方法理解为    属性的只读, 我想这也是为什么它和其他三个方法名字不一样的原因

__getattr__会在没有找到该属性的时候执行,__setattr__用来增加一个属性,__delattr__用来删除一个属性。

 

 

 

然后是property和descriptor

之所以有这些是因为希望     访问对象属性时,能够控制   对象属性   get,set,del  的过程

 

property就是      python语言自带的     descriptor,     所以它功能不够定制化,一些类所拥有的优点(例如   类可以继承, 类可以带有类属性)这些property都不支持。

所以在property的基础上   有了    descriptor

 

 

 

 

最后是metaclass

这是因为某些场景   例如ORM,Django中的validator,这个时候人们希望能够     控制类的属性

1. 首先想到的方式是class decorator,     但是这种方式的缺点是   这种方式是基于函数的, 所以不像class一样能够继承

2. 然后人们想到了 metaclass,

   首先明确一点,type      是python语言自带的    metaclass,     在声明class的时候,背后的机理就是type(classname, bases, attr_dict),   背后就是type这个metaclass生成了  class 

   但是type由于是自带的,很显然不能定制化,    所以有时候就需要人们自己编写    metaclass

    自己编写的 metaclass继承  type   ,所以继承了type能够创建  class的能力(我想这就是继承的含义:    子类       能够继承    父类的能力)

posted @ 2018-05-04 15:47  eeechoo  阅读(183)  评论(0编辑  收藏  举报