描述符的属性方法

__get__(self, instance, owner): 用于访问属性,返回属性的值

__set__(self, instance, value): 用于给属性赋值时,返回属性的值

__delete__(self, instance): 用于删除属性时,不返回任何内容

将某种特殊类型的类的实例指派给另一个类的属性(注意:是类属性,不是实例属性),而这种特殊类型的类是实现了__get__,__set__,__delete__这三个方法中的一个或多个,此时这个实例被称为描述符,而被指派属性的类叫做描述符类

描述符优点:保护属性不受修改、属性类型检查和自动更新某个依赖属性的值等。

>>>class Desc:      #Desc是包含了三种方法中任意个的特殊类型的类
  def __get__(self,instance,owner):
    print('getting',self,instance,owner)
  def __set__(self,instance,value):
    print('setting',self,instance,value)
  def __delete__(self,instance):
    print('deleting',self,instance)
>>>class MyDesc(): #MyDesc这个类叫描述符类
>>>x = Desc() #类对象被指派给其他类作为属性,此时Desc()就是一个描述符
>>>mydesc = MyDesc()
>>>mydesc.x
getting <__main__.Desc object at 0x0000024A437D8F98> <__main__.MyDesc object at 0x0000024A43857EB8> <class '__main__.MyDesc'>
>>>mydesc.x = 1
setting <__main__.Desc object at 0x0000024A437D8F98> <__main__.MyDesc object at 0x0000024A43857EB8> 1
>>>del mydesc.x
deleting <__main__.Desc object at 0x0000024A437D8F98> <__main__.MyDesc object at 0x0000024A43857EB8>

self: Desc object -> Desc的实例化对象,指的是x

instance: MyDesc -> MyDesc的实例化对象,指的是mydesc

owner: MyDesc -> 指的就是MyDesc类

>>>class MyDes:
  def __init__(self,values,attr):
    self.values = values
    self.attr = attr
  def __get__(self,instance,owner):
    print('正在获取变量:',self.attr)
    return self.values
  def __set__(self,instance,value):
    print('正在修改变量:',self.attr)
    self.values = value
  def __delete__(self,instance):
    print('正在删除变量:',self.attr)
    print('唔,这个变量没法删除')
>>>class Test:
  x=MyDes(10,'x')
>>>test = Test()
>>>test.x
10
>>>test.x=8
正在修改变量: x
>>>test.x
8
>>>del test.x
正在删除变量: x
这个变量没法删除
>>>test.x

Python笔记(二十五)_魔法方法_描述符的更多相关文章

  1. python3.4学习笔记(二十五) Python 调用mysql redis实例代码

    python3.4学习笔记(二十五) Python 调用mysql redis实例代码 #coding: utf-8 __author__ = 'zdz8207' #python2.7 import ...

  2. Python笔记(4)类__属性与描述符

    部分参考自:http://www.geekfan.net/7862/ 新式类与经典类 2和3不一样,3都是新式类. 新式类和经典类的区别: class A: #classic class " ...

  3. Python笔记(二十六)_魔法方法_属性的魔法方法

    属性的魔法方法 __getattribute__(self,name):当该类的属性被访问时,自动触发,是最先被触发的属性方法 __setattr__(self,name,value):当一个属性被设 ...

  4. Python笔记(二十八)_魔法方法_迭代器

    迭代器用于遍历容器中的数据,但它不是容器,它是一个实现了__next__方法的对象 与迭代器相关的内置函数: iter(): 将一个对象转换成一个迭代器 next(): 访问迭代器中的下一个变量,直到 ...

  5. Python笔记(二十三)_魔法方法_字符串的魔法方法

    __str__和__repr__ 如果要把一个类的实例变成字符串,就需要实现魔法方法__str__()和__repr__ >>>class A: def name(self): re ...

  6. 笨办法学Python(二十五)

    习题 25: 更多更多的练习 我们将做一些关于函数和变量的练习,以确认你真正掌握了这些知识.这节练习对你来说可以说是一本道:写程序,逐行研究,弄懂它. 不过这节练习还是有些不同,你不需要运行它,取而代 ...

  7. 课时46:魔法方法:描述符(property的原理)

    目录: 一.描述符(property的原理) 二.课时46课后习题及答案 ********************************** 一.描述符(property的原理) ********* ...

  8. 第十五节、韦伯局部描述符(WLD,附源码)

    纹理作为一种重要的视觉线索,是图像中普遍存在而又难以描述的特征,图像的纹理特征一般是指图像上地物重复排列造成的灰度值有规则的分布.纹理特征的关键在于纹理特征的提取方法.目前,用于纹理特征提取的方法有很 ...

  9. Python笔记(二十四)_魔法方法_运算符的魔法方法

    算数运算方法 .反运算方法 以对象A+对象B为例,都是将A作为self值,而B作为other值传入__add__(self,other)方法: 当用户输入A+B,就会调用重写的add方法: >& ...

随机推荐

  1. MySQL之表查询

    语法执行顺序 from >>>从那张表 where >>> 全局的筛选条件 group by>>> 必须是用在where 之后一组就是为了接下来我 ...

  2. Linux--shell函数--08

    1.函数介绍 为了避免代码的重复使用,我们一般通过函数编写代码块,而这一个代码块用来实现某种功能:且这个功能在后面的代码中会重复使用. 2.函数的语法格式: [ function ] 函数名 [ ( ...

  3. 四、续绑定SignaIR的用户管理-(添加好友和消息盒子)

    一.聊天消息表(普通消息,申请消息,群聊消息) CREATE TABLE MSG_INFO ( MSG_Id INT PRIMARY KEY AUTO_INCREMENT, -- 消息标识 MSG_T ...

  4. 四、绑定SignaIR的用户管理

    一.用户分组(第一个默认我的好友,禁删和更改) 没有分组id,更改layim代码: 更改id即可. layui.define('jquery', function (exports) { " ...

  5. 计蒜客 蓝桥模拟 B.素数个数

    用 0,1,2,3⋯70,1,2,3 \cdots 70,1,2,3⋯7 这 888 个数组成的所有整数中,质数有多少个(每个数字必须用到且只能用一次). 提示:以 000 开始的数字是非法数字. 代 ...

  6. get请求和post请求参数中文乱码的解决办法

    get请求参数中文乱码的解决办法 在tomcat的server.xml里的Connector加个URIEncoding="UTF-8",把 <Connector connec ...

  7. DevOps书单:调研了101名专家,推荐这39本必读书籍

    任何一个领域都遵循从新人到熟手,从熟手到专家的路径.在成长过程中,DevOps人经常会陷入没人带,没人管,找不到职业方向的迷茫. DevOps是在商业演进与企业协作的进化过程中诞生的一个全新职业,被很 ...

  8. 接触oracle的第二天

    1.2 Sqlplus 这是一个轻量级的功能强大的客户端, 是 dba 必须掌握的工具. 我们可以配置 sqlplus 的一些行为,两个命令: show. 用来显示配置参数 set. 用来设置配置参数 ...

  9. vue请求数据

    vue-resource: 推荐教程:https://www.runoob.com/vue2/vuejs-ajax.html 1. 需要安装vue-resource模块, 注意加上 --save np ...

  10. 【NOIP2016提高A组模拟8.14】疯狂的火神

    题目 火神为了检验zone的力量,他决定单挑n个人. 由于火神训练时间有限,最多只有t分钟,所以他可以选择一部分人来单挑,由于有丽子的帮助,他得到了每个人特定的价值,每个人的价值由一个三元组(a,b, ...