描述符的属性方法

__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. Apache Allow 命令

    用于设置哪些客户端可以访问 Apache,格式如下: Allow from [All /全域名/部分域名/IP 地址/网络地址/CIDR 地址] All:表示全部客户端 全域名:表示域名对应的客户端, ...

  2. Ubuntu配置python操作

    Ubuntu16.04 安装python 查看当前python情况root@localhost:/# cd /root@localhost:/usr/bin# cd /usr/binroot@loca ...

  3. CentOS 7 查看硬盘情况

    用命令: lsblk                                  查看分区和磁盘 df -h                                        查看整 ...

  4. 最小可观(Minimal Observability Problem in Conjunctive Boolean Networks)

    论文链接 1. 什么是 conjunctive Boolean network (CBN) 仅仅包含and运算. 下面这个式子为恒定更新函数 2. 什么是可观 定义在时刻k是CBN的状态为 X(k) ...

  5. 编写第一个python程序(Your Firsr Program)

    1)代码如下: 1 # This program says hello and asks for my name. 2 myName = input("What is your name?& ...

  6. Linux虚拟机网络设置问题

    使用的是VM 工作站15 和以前的不一样 没有什么虚拟机网络设置 :打开Edit->Virtual NetWork editor, 选中VMnet8,然后点击NAT Setting按钮,再点击D ...

  7. Spark--wordcount(词频降序)

    import org.apache.spark.{SparkConf, SparkContext} object wc2 { def main(args: Array[String]): Unit = ...

  8. 数组Array方法: indexOf、filter、forEach、map、reduce使用实例

  9. 最大流 && 最小费用最大流模板

    模板从  这里   搬运,链接博客还有很多网络流题集题解参考. 最大流模板 ( 可处理重边 ) ; const int INF = 0x3f3f3f3f; struct Edge { int from ...

  10. Error:MySQLAdministrator无法连接到实例

    Q:利用MySQLAdministrator登录时显示could not connect to the specific instance,使用ping指令后可以ping通,如下所示: A:这里能够p ...