Python学了好几年,发现功力还是那样,很多同学经常这样抱怨!都说Python入门容易,精通难,确实是这样的,每当我们打开一些牛逼的源码框架,进去看窥探大牛的源码,比如Python里面非常著名的Django和Flask里面的源码,发现跟天书一样

大神都大量的使用了一些元编程,魔法函数,以及类的一些深入特性,做了很多封装。最近菜鸟哥准备写一个系列,假装Python高手系列,欢迎大家来指导工作。

今天我们写一下入门的篇,什么是描述符类!

1.问题的来源

所有的高级技巧其实都是为了让代码更简洁,更好复用,更好扩展,就是为了这个道,而产生出很多法,设计出什么招式来解决。比如我们在实际的项目中会要设计一个Student类,类似这样的:

这个类的接口有两个参数,一个是输入学生的年龄(age),一个是输入学生的成绩(score)。但是细细想,我们录入年龄和成绩的时候,需要判断是否是整数而且会有一定的范围,就是入口参数检测

于是我们就会把代码复杂到这样:

我们要检查年龄是否是int and 大于0,要检查score是否为int and 在0-100之间。这样的检查非常啰嗦很冗余,如果我们这个系统有10个类似的这样的参数都这检查,是不是非常麻烦,代码越写越长,全部挤在一起,又重复有不好debug,肿怎么办?

2.如何解决

我先来看一下大师是怎么处理这样的问题的,尤其是写框架的大师,比如django中设计model的时候我们会碰到很多类似的这样的模型参数:

这个是我们从django里面随便拿出一段model设计的代码,oam创建模型的时候,我们有age/phone这样的small int的参数,就会有用一个SmalIntergerField类型去进行封装检查。

而这个SmallIntergerField就是描述符的类,就是把一个类作为一个类属性进行封装。我们回到上面的student这个类,进一步的拆解。

我们希望我们的类还是设计的很简单,但是在self.age=age进行赋值的时候,能自动的帮我进行检查,这个时候就是类描述符上场了。

class Student:def __init__(self,age,score):self.age=ageself.score=score

3.什么是属性描述符类

就是如果一个类里面带__get__,__set__,__del__魔法函数一个或者多个的类就是描述符类。他会有特殊的用法,比如我们设计一个IntField这样的类:

那么这样的描述符类有什么特殊的用处的,其实这就是假装Python高手的精华地方,我们需要把这个描述符类作为一个属性封装到Student类里面。

4.进阶高手,设计属性描述符类

经过前面的讲解,大家知道了问题所在,已经什么是描述符类,这样知识要串起来才有用,那么如何利用把描述符类封装到Student类里面来帮助我们解决上面的痛点呢。其实很简单,看代码:

我们可以很清楚的看到,我们在Student类里面设计了一个类属性age,它其实是一个描述符的类,当我们在init里面赋值给self.age=age的时候,就会自动触发调用__set__函数,而这个里面就可以帮助我们进行参数检测。

我已经打印了set传入参数,比如instance其实就是我们传入的student这个对象也就是(self),而value其实就是age的值。既然这两个最重要的东西都传进来了,那么我们就可以在set函数里面随意的添加我们的业务逻辑检查了(比如一开始说到的参数预检测)

这里的设计有点复杂,我们分几个方面讲:

1).如果传入的value进行类型检查,如果不是int ,报错

2).如果传入的value是年龄并且<0,报错

3).如果传入的value是成绩并且<0 或者>100,报错

4).如果以上都不满足,说明我们输入的参数是正确的,我们需要把这个属性添加到我们的类里面,这样就可以方便的s.age进行调用

这样的话,我们在外边使用这个student对象的时候,可以非常简单和轻松,而复杂的逻辑都封装到了IntField里面,如果我们代码要扩展比如增加一些类似的int参数,代码只要增加一行,是不是感觉自己Python高手了一点。

好,今天的分享就到这里,我们的假装Python系列才刚刚开始,欢迎在留言区指导工作,你品,你细品。

推荐阅读:

入门: 最全的零基础学Python的问题  | 零基础学了8个月的Python  | 实战项目 |学Python就是这条捷径

量化: 定投基金到底能赚多少钱?  | 我用Python对去年800只基金的数据分析

干货:爬取豆瓣短评,电影《后来的我们》 | 38年NBA最佳球员分析 |   从万众期待到口碑扑街!唐探3令人失望  | 笑看新倚天屠龙记 | 灯谜答题王 |用Python做个海量小姐姐素描图 |碟中谍这么火,我用机器学习做个迷你推荐系统电影

趣味:弹球游戏  | 九宫格  | 漂亮的花 | 两百行Python《天天酷跑》游戏!

AI: 会做诗的机器人 | 给图片上色 | 预测收入 | 碟中谍这么火,我用机器学习做个迷你推荐系统电影

小工具: Pdf转Word,轻松搞定表格和水印! | 一键把html网页保存为pdf!|  再见PDF提取收费! | 用90行代码打造最强PDF转换器,word、PPT、excel、markdown、html一键转换 | 制作一款钉钉低价机票提示器! |60行代码做了一个语音壁纸切换器天天看小姐姐!|

年度爆款文案

  • 1).卧槽!Pdf转Word用Python轻松搞定!

  • 2).学Python真香!我用100行代码做了个网站,帮人PS旅行图片,赚个鸡腿吃

  • 3).首播过亿,火爆全网,我分析了《乘风破浪的姐姐》,发现了这些秘密

  • 4).80行代码!用Python做一个哆来A梦分身

  • 5).你必须掌握的20个python代码,短小精悍,用处无穷

  • 6).30个Python奇淫技巧集

  • 7).我总结的80页《菜鸟学Python精选干货.pdf》,都是干货

  • 8).再见Python!我要学Go了!2500字深度分析

  • 9).发现一个舔狗福利!这个Python爬虫神器太爽了,自动下载妹子图片

点阅读原文,领AI全套资料!

假装Python高手,你真的懂属性描述符类!相关推荐

  1. python 属性描述符_Python属性描述符(二)

    Python存取属性的方式特别不对等,通过实例读取属性时,通常返回的是实例中定义的属性,但如果实例未曾定义过该属性,就会获取类属性,而为实例的属性赋值时,通常会在实例中创建属性,而不会影响到类本身.这 ...

  2. python 属性描述符

    文章目录 1. 描述符示例:验证属性 2. 自动获取储存属性的名称 3. 继承改进 4. 覆盖型与非覆盖型描述符对比 4.1 覆盖型描述符 4.2 没有 `__get__` 方法的覆盖型描述符 4.3 ...

  3. Python:高级主题之(属性取值和赋值过程、属性描述符、装饰器)

    属性取值和赋值过程 一切皆是对象,类型也是对象. 对象包含一个__class__属性指向其所属类型. 对象包含一个__dict__属性指向其所包含的成员(属性和方法). 取值过程(下面是伪代码) 1 ...

  4. python特性描述_详解 Python 最优雅的特性之一 — 描述符

    本篇选自 Python黑魔法指南 -> 第四章 -> 第2节. github仓库: https://github.com/iswbm/magic-python magic-python 目 ...

  5. 属性python_Python属性描述符(一)

    描述符是对多个属性运用相同存取逻辑的一种方式,,是实现了特性协议的类,这个协议包括了__get__.__set__和__delete__方法.property类实现了完整的描述符协议.通常,可以只实现 ...

  6. 关于属性描述符PropertyDescriptor

    本文首发于本博客 猫叔的博客,转载请申明出处 前言 感谢GY丶L粉丝的提问:属性描述器PropertyDescriptor是干嘛用的? 本来我也没有仔细了解过描述符这一块的知识,不过粉丝问了,我就抽周 ...

  7. JavaScript(3)之——对象的属性描述符

      对象的属性描述符是一个初学者容易忽略但是非常重要的特性,像是vue的数据双向绑定就是用它做文章.且关于它的方法和属性也很多,今天我来总结一下. 属性描述符概述   对象的每个属性都具备了属性描述符 ...

  8. javascript --- 属性描述符

    从ES5开始,所有的属性都具备了属性描述符 var myObject = {a: 2 };Object.getOwnPropertyDescriptor(myObject, "a" ...

  9. python __set__ __get___python3面对像进阶——描述符(__get__,__set__,__delete__)

    描述符只实用于大型框架 1.描述符是什么? 描述符本质就是一个新式类,在这个新式类中,至少实现了__get__(),__set__(),__delete__()中的一个,这也被称为描述符协议 __ge ...

最新文章

  1. 替代方法_ASD干预:替代行为的正确使用方法和注意事项
  2. J20170524-hm
  3. 自己服务器上部署APP应用(安卓和IOS版),下载页面的代码,以及IOS的xxx.plist文件的建立
  4. 100行java电路程序_easyopen原理解析——不到100行代码实现一个最精简的easyopen
  5. android 分支管理,Android Studio git使用,包括协同开发,分支管理。
  6. C语言里最基础的关键字
  7. 解决ubuntu首次安装Mysql之后,首次登录出现ERROR 1698 (28000): Access denied for user 'root'@'localhost'的方法
  8. 手机电脑的芯片主要是由_全体起立!苹果自研电脑芯片登场,iOS迎大更新…WWDC20精彩远不止这些...
  9. 全系统动态污点分析-概要
  10. macosx 不允许无名信号量_个人对S12X的协处理器XGATE的信号量semaphore的理解
  11. Nginx使用Expires增加浏览器缓存加速
  12. php curl 缓存请求_PHP异步非阻塞实现方法
  13. java源码-LinkedHashMap
  14. Delphi 2010
  15. visio 2010激活教程
  16. 青出于蓝胜于蓝 (dfs序 + BIT)
  17. 通过银行卡前缀判断归属
  18. 机器学习:CS 229 - Machine Learning - Supervised Learning cheatsheet
  19. JAVA入门:猜大小程序
  20. 《所谓会说话,就是会换位思考》总结

热门文章

  1. 如何组建开发团队-激励团队气势
  2. 达观数据签约绿地集团西南事业部,RPA助力房地产行业构建智能办公平台
  3. 台式电脑怎么调分辨率_电脑分辨率调最大了怎么办【详细介绍】
  4. 使用unity制作瞄准镜
  5. python路径转换为选区_Python,Linux,PS随记
  6. 潘森(python)数据类型
  7. android受限广播保护机制,Android受限广播保护机制
  8. 如何批量生成彩色渐变二维码
  9. 如何跟客户谈场持久的恋爱 – 数字驱动的积分商城运营
  10. Jps命令—使用详解