码迷,mamicode.com
首页 > 编程语言 > 详细

Python进阶-----描述符(__get__(),__set__(),__delete__())

时间:2018-11-02 21:40:47      阅读:184      评论:0      收藏:0      [点我收藏+]

标签:att   赋值   执行   实现   print   sel   col   数据   elf   

一、描述符是什么
  描述符本质就是一个新式类,在这个新式类中,至少实现了__get__(),__set__(),__delete__()中的一个,这也被称为描述符协议
  __get__():调用一个属性时,触发
  __set__():为一个属性赋值时,触发
  __delete__():采用del删除属性时,触发

1 class Foo: #在python3中Foo是新式类,它实现了三种方法,这个类就被称作一个描述符
2     def __get__(self, instance, owner):
3         print(__get__(),被执行了)
4     def __set__(self, instance, value):
5         print(__set__(),被执行了)
6     def __delete__(self, instance):
7         print(__delete__(),被执行了)

二、描述符的作用
  描述符的作用是用来代理另外一个类的属性的(必须把描述符定义成这个类的类属性,不能定义到构造函数中)

1 class Test:
2     x = Foo()
3     def __init__(self,x):
4         self.x = x
5 
6 t = Test(2)      #‘__set__(),被执行了‘
7 print(t.x)         #‘__get__(),被执行了‘   ‘None‘

三、描述符分为两种
  1、数据描述符:至少实现了__get__()和__set__()
  2、非数据描述符:没有实现__set__()

 1 #数据描述符
 2 class Foo:
 3     def __set__(self, instance, value):
 4         print(set)
 5     def __get__(self, instance, owner):
 6         print(get)
 7 
 8 #非数据描述符
 9 class Foo:
10     def __get__(self, instance, owner):
11         print(get)

四、注意事项:
  描述符本身应该定义成新式类,被代理的类也应该是新式类
  必须把描述符定义成这个类的类属性,不能为定义到构造函数中
  要严格遵循该优先级,优先级由高到底分别是
    1类属性
    2数据描述符
    3实例属性
    4非数据描述符
    5找不到的属性触发__getattr__()

Python进阶-----描述符(__get__(),__set__(),__delete__())

标签:att   赋值   执行   实现   print   sel   col   数据   elf   

原文地址:https://www.cnblogs.com/Meanwey/p/9898222.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!