描述符的属性方法

__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. linux下解压缩.tar.bz2到某目录下

    1\可先进入要解压的目的目录,然后使用tar命令 比如我要将桌面的a.tar.bz2解压到/var/b cd   /var/b tar   -xjf   /root/Desktop/a.tar.bz2 ...

  2. 关于阅读Struts2部分拦截器源码的记录

    Struts2中的拦截器在ActionInvocation对象的invoke()方法中执行. ActionInvocation对象从配置文件中读取Interceptor对象,加入到自己的存取拦截器的容 ...

  3. [转载]NOR和NAND 存储器的联系与区别

    转载了,对于我理解两种Flash起到了帮助,希望博主继续再接再厉,更新博文 原文地址:存储器的联系与区别">NOR和NAND 存储器的联系与区别作者:暴走的工程师 一.类型理解     ...

  4. [每日一学]apache camel|XSLT|SAXON

    最近工作中,用到xslt文件来描述和配置xml文件的转换规则和业务逻辑,开始用jdk自带的TransformerFactory, 有严重的性能问题 后来用Saxon 的com.saxonica.con ...

  5. shell脚本中oldIFS=$IFS

    https://blog.csdn.net/champwang/article/details/54670293 转自https://man.linuxde.net/shell-script/shel ...

  6. linux ab 压测

    https://www.cnblogs.com/shenshangzz/p/8340640.html https://www.cnblogs.com/shenshangzz/p/8340640.htm ...

  7. java定义时间

    import java.text.SimpleDateFormat; import java.util.Date; SimpleDateFormat format=new SimpleDateForm ...

  8. Cloneable接口的作用与深度克隆与浅度克隆

    cloneable接口的作用 cloneable其实就是一个标记接口,只有实现这个接口后,然后在类中重写Object中的clone方法,然后通过类调用clone方法才能克隆成功,如果不实现这个接口,则 ...

  9. CSS3画五角星和六角星

    最终想要实现的效果 一.五角星 在画五角星之前首先分析这个五角星是如何实现,由哪几个部分构成的,示意图如下: 三个顶角向上的三角形,通过设置旋转和定位相互重叠和拼接实现最终的五角星效果. 为了语义化和 ...

  10. 接口返回[object,Object]解决方法

    1.我们请求接口时有时会返回[object,Object],[object,Object],[object,Object].... 这个我们使用JSON.stringfity(data),就可以解决.