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

一、描述符是什么
  描述符本质就是一个新式类,在这个新式类中,至少实现了__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__()

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

时间: 2024-10-10 11:45:08

Python进阶-----描述符(__get__(),__set__(),__delete__())的相关文章

十八.描述符(__get__,__set__,__delete__)

描述符(__get__,__set__,__delete__) 4 注意事项: 一 描述符本身应该定义成新式类,被代理的类也应该是新式类 二 必须把描述符定义成这个类的类属性,不能为定义到构造函数中 三 要严格遵循该优先级,优先级由高到底分别是 1.类属性 2.数据描述符 3.实例属性 4.非数据描述符 5.找不到的属性触发__getattr__() 1 描述符是什么:描述符本质就是一个新式类,在这个新式类中,至少实现了__get__(),__set__(),__delete__()中的一个,这

描述符__get__(),__set__(),__delete__()(三十七)

http://www.cnblogs.com/linhaifeng/articles/6204014.html#_label12 描述符是什么:描述符本质就是一个新式类,在这个新式类中,至少实现了__get__(),__set__(),__delete__()中的一个,这也被称为描述符协议 __get__():调用一个属性时,触发 __set__():为一个属性赋值时,触发 __delete__():采用del删除属性时,触发 定义一个描述符 描述符是干什么的:描述符的作用是用来代理另外一个类的

描述符(__get__,__set__,__delete__)

目录 描述符 描述符的作用 何时,何地,会触发这三个方法的执行 两种描述符 数据描述符 非数据描述符 描述符注意事项 使用描述符 牛刀小试 拔刀相助 磨刀霍霍 大刀阔斧 类的装饰器:无参 类的装饰器:有参 刀光剑影 描述符总结 自定制@property property回顾 自定制property 实现延迟计算功能 打破延迟计算 自定制@classmethod 自定制@staticmethod 描述符 描述符是什么:描述符本质就是一个新式类,在这个新式类中,至少实现了__get__(),__se

Python属性描述符(二)

Python存取属性的方式特别不对等,通过实例读取属性时,通常返回的是实例中定义的属性,但如果实例未曾定义过该属性,就会获取类属性,而为实例的属性赋值时,通常会在实例中创建属性,而不会影响到类本身.这种不对等的方式对描述符类也有影响. def cls_name(obj_or_cls): # 传入一个实例,返回类名 cls = type(obj_or_cls) if cls is type: cls = obj_or_cls return cls.__name__.split('.')[-1] d

python 属性描述符及属性查找顺序

1 import numbers 2 class IntField: # 当一个类实现了 __get__, __set__, __delete__ 3 """ 4 数据描述符 5 """ 6 def __get__(self, instance, owner): 7 return self.value 8 def __set__(self, instance, value): 9 if not isinstance(value, numbers.

[TimLinux] Python 自定义描述符

1. 含义 在类中,含有属性(该属性需要存在类对象到__dict__属性中,不能为存在示例对象的__dict__属性中),对属性对操作(访问,设置值,删除)可以自定义行为,这样对自定义行为成为自定义属性描述符(Descriptor),这样的属性对象来自相应对类,这样的类称为描述符类. 2. 结构 class A(object): pass # 实现任一一个或多个:__get__, __set__, __delete__, __set_name__ # 类A称为描述符类 class T(objec

python之描述符

描述符是将某种特殊类型的类实例指派给另一个类的属性,某种特殊类型的类就是这个类里面封装了get,set,delete这三个方法,可以将这个类指派给另一个类的某一个属性,这样就可以通过这三个方法对该属性进行操作,举例如下 1 class MyDecriptor: 2 def __set__(self,instance,value): 3 print('set') 4 def __get__(self,instance,owner): 5 print('get') 6 def __delete__(

Python属性描述符(一)

描述符是对多个属性运用相同存取逻辑的一种方式,,是实现了特性协议的类,这个协议包括了__get__.__set__和__delete__方法.property类实现了完整的描述符协议.通常,可以只实现部分协议,如只实现了__get__或__set__,而不必把__get__.__set__和__delete__全部实现 现在,让我们用描述符协议升级上一个章节Python动态属性和特性(二)的LineItem类 图1-1 我们将定义一个Quantity类,LineItem类会用到两个Quantit

python Descriptor (描述符)

简介: python 描述符是新式类(继承自object)中的语言协议,基于描述符可以提供更佳优雅的解决方案. python的classmethod, staticmethod, property都是基于描述符建立的. 描述符的协议: 定义了__set__, __get__, __delete__3个方法中任何一个方法的object可以作为描述符. 描述符分类: 同时定义了__set__,__get__被叫做data descriptor. 只定义了__get__被叫做no-data descr