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的能力(我想这就是继承的含义:    子类       能够继承    父类的能力)

转载于:https://www.cnblogs.com/eeechoo/p/8990974.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值