1.上下文管理协议

  在对文件进行处理也是实例化的过程,在用with打开文件时,会直接出发open函数中的enter方法,在with函数调用结束后,会直接exit方法

  根据一切皆对象,除了open类之外,自己也可以自定义类,来自定义根据enter和exit完成特定的目的

  

class Test:def __init__(self,name):self.name=namedef __enter__(self):print('this is enter')return self#返回一个值给fdef __exit__(self, exc_type, exc_val, exc_tb):print('this is exit')print(exc_type,'exctype')#在代码块内如果有一场的话,会将异常类型,异常值,追踪信息返回print(exc_val,'val')print(exc_tb,'tb')
with Test('a') as f:#此时出发enterprint('start opening')#在with内执行代码
print('this is end')#with内代码执行完,执行exit代码,接着执行本段代码

2.描述符的应用

  利用描述符以及描述符的优先级,来给用户输入的值进行类型检测#传入的值必须是字符串,否则报错

  2.1 错误示范

    

class Fun:def __init__(self,name,age,gender):#name为字符串,age为数字,gender为字符串self.name=nameself.age=ageself.gender=genderdef show(self):print(self.name,self.age,self.gender)
p1=Fun('100','yehaibin','male')
p1.show()#并不能对输入的类型进行限制
#其他解决方法:直接str或者int

  2.2使用描述符来进行自定义

  

#利用描述符以及描述符的优先级,来给用户输入的值进行类型检测#传入的值必须是字符串,否则报错
#实例化的时候,如果错了,在调用时提醒
#对值进行设置的时候,如果错了,则提醒,get和set
class Name_Str:def __init__(self,key):self.key=keydef __get__(self, instance, owner):#instance是传来的实例,# print(instance)return instance.__dict__[self.key]def __set__(self, instance, value):if isinstance(value,str):# type(self.key) == str:instance.__dict__[self.key] = valueelse:print('your input %s is wrong,please input an str' %self.key)def __delete__(self, instance):pass
class Age_Int:def __init__(self,key):#key为‘’ageself.key=keydef __get__(self, instance, owner):#instance是传来的实例,# print(instance)return instance.__dict__[self.key]def __set__(self, instance, value):if isinstance(value,int):# type(self.key) == str:instance.__dict__[self.key] = valueelse:print('your input %s is wrong,please input an int' %self.key)def __delete__(self, instance):passclass Fun:#直接在设置属性的时候,进行查看name=Name_Str('name')age=Age_Int('age')gender=Name_Str('gender')def __init__(self,name,age,gender):#name为字符串,age为数字,gender为字符串self.name=nameself.age=ageself.gender=genderdef show(self):print(self.name,self.age,self.gender)
p1=Fun('100',555,'100')
# print(p1.name)#因为数据描述符的属性比实例属性的级别高,所以直接调用数据描述符get
# p1.name='500'
# print(p1.name)
# p1.gender='500'
# print(p1.gender)
p1.age=11#出发set,p1为instance,11为value
print(p1.age)

转载于:https://www.cnblogs.com/hai125698/p/9326678.html

2018-07-17-Python全栈开发day28-描述符应用与类的装饰器-part1相关推荐

  1. python全栈学习--day12(函数高级应用-带参数的装饰器,多个装饰器装饰一个函数)...

    函数的执行时,*打散 函数的定义时,*聚合 from functools import wrapsdef wrapper(f):@wraps(f)def inner(*args,**kwargs):' ...

  2. python类装饰器应用_python之描述符应用与类的装饰器

    一.描述符应用 1.1上下文管理协议 在上文中我们提到with语句中的上下文管理器.with语句可以如此简单但强大,主要依赖于上下文管理器.那么什么是上下文管理器?上下文管理器就是实现了上下文协议的类 ...

  3. python全栈开发工程师_【2018重磅巨献】老男孩Python高级全栈开发工程师第三期...

    2018年老男孩python全栈第三期老男孩python全栈3期 老男孩教育Python全栈开发为国内首家专注python全方面开发的教育机构 老男孩Python全栈第三期课程详细目录,高清不加密! ...

  4. 某宝版千峰2018最新Python全栈开发加人工智能视频教程-尹成

    某宝版千峰2018最新Python全栈开发加人工智能视频教程-尹成重点内容 下载地址: http://www.itxdl.cn

  5. python 全栈开发,Day86(上传文件,上传头像,CBV,python读写Excel,虚拟环境virtualenv)

    python 全栈开发,Day86(上传文件,上传头像,CBV,python读写Excel,虚拟环境virtualenv) 一.上传文件 上传一个图片 使用input type="file& ...

  6. python 全栈开发,Day136(爬虫系列之第3章-Selenium模块)

    python 全栈开发,Day136(爬虫系列之第3章-Selenium模块) 一.Selenium 简介 selenium最初是一个自动化测试工具,而爬虫中使用它主要是为了解决requests无法直 ...

  7. python 全栈开发之路 day1

    python 全栈开发之路 day1 本节内容 计算机发展介绍 计算机硬件组成 计算机基本原理 计算机 计算机(computer)俗称电脑,是一种用于高速计算的电子计算机器,可以进行数值计算,又可以进 ...

  8. 路飞学城python全栈开发_[Python] 老男孩路飞学城Python全栈开发重点班 骑士计划最新100G...

    简介 老男孩&路飞学城Python全栈开发重点班课程,作为Python全栈教学系列的重头戏,投入了全新的课程研发和教学精力,也是Python骑士计划的核心教学,由ALEX老师开班镇守,一线技术 ...

  9. python 全栈开发,Day104(DRF用户认证,结算中心,django-redis)

    python 全栈开发,Day104(DRF用户认证,结算中心,django-redis) 考试第二部分:MySQL数据库 6.  MySQL中char和varchar的区别(1分) char是定长, ...

最新文章

  1. 关于AttributeError: module ‘numpy‘ has no attribute ‘integer‘的解决方法
  2. 【错误记录】Android Gradle 配置报错 ( gradle.properties 配置到 BuildConfig 中需要注意类型转换 | 位置: 类 BuildConfig )
  3. 如何通俗理解拉格朗日对偶问题(part1)
  4. android 文件读写
  5. 孩子大了真是不好管了
  6. 使用命名空间、头文件和实现文件
  7. lrange是取出所有值并移除么_部落冲突:兵营容量提升,移除超级部队、英雄防御状态冷却时间...
  8. oracle标量子查询的优势,标量子查询
  9. 迪米特法则(设计模式5)
  10. Java案例:简易记事本
  11. VS2010编译驱动程序
  12. ip地址与整数的相互转化
  13. jcr多久更新一次_2020年期刊影响因子正式发布,几家欢喜几家愁?!
  14. IISPUT上传漏洞
  15. 从零开始一个cli脚手架并发布到NPM(上篇)
  16. 离散元pfc 岩土工程
  17. 阿里云虚拟机多域名配置
  18. kbhit(), bioskey(), system(pause)
  19. Unity项目--LoyPoly风格的FPS Demo(附试玩地址)
  20. 怎么制作区域分布图,怎么做网点分布图

热门文章

  1. 二进制转十进制-栈的方式实现
  2. Linux-0.00 代码解析(四)
  3. java.lang.IllegalStateException: ViewStub must have a non-null ViewGroup viewParent
  4. Making Sense of Cryptoeconomics
  5. 探索7.x, 全面解析Activity启动框架 (1)
  6. Android异步任务机制之AsycTask
  7. 使用snmp4j实现Snmp功能(一)
  8. Android设计模式MVVM之DataBinding简单使用
  9. mac终端mysql的字符集_mac下修改mysql默认字符集为utf8
  10. python类的应用_Python · 元类(Meta Class)及其应用