python描述器的分类
- 更新时间:2021-06-22 09:57:52
- 编辑:林向阳
给网友们整理相关的编程文章,网友宰新波根据主题投稿了本篇教程内容,涉及到Python相关内容,已被249网友关注,内容中涉及的知识点可以在下方直接下载获取。
参考资料
- Python数据可视化之matplotlib实践 PDF 电子书 / 96.7 MB / 刘大成 推荐度:
- Python程序设计入门到实战 PDF 电子书 / 423.1 MB / 何敏煌 推荐度:
- Odoo快速入门与实战:Python开发ERP指南 PDF 电子书 / 21 MB / 刘金亮 推荐度:
- Python数据分析技术手册:基础·实战·强化 PDF 电子书 / 50.1 MB / 明日科技 推荐度:
- 卷积神经网络的Python实现 PDF 电子书 / 113.8 MB / 单建华 推荐度:
正文内容
给学习python的读者整理一篇《python描述器的分类》优秀文章,技术点分析的很透彻,这里给大家转摘到这里,觉得好就请收藏下。
本文教程操作环境:windows7系统、Python 3.9.1,DELL G3电脑。
1、非数据描述器
非数据描述器,只对类属性产生作用。当访问类属性时,将调用描述器的__get__方法。当非数据描述器是实例的变量时,实例访问非数据描述器不会调用__get__方法,只是访问了描述器类的实例。
# 示例 class Student1: def __init__(self): self.course = 'Python' print('Student1.__init__') class Student2: stu1 = Student1() # Student1()返回的是Student1类的实例 def __init__(self): print('Student2.__init__') print(Student2.stu1.course) # 创建Student2的实例对象 stu2 = Student2() print(stu2.stu1.course) # 示例:引入描述器 class Stduent1: def __init__(self): self.course = 'Python' print('Stduent1.__init__') def __get__(self, instance, owner): print('self={} instance={} owner={}'.format(self, instance, owner)) class Stduent2: stu1 = Stduent1() def __init__(self): print('Stduent2.__init__') print(Stduent2.stu1.course) # Stduent2.stu1会访问Stduent1的实例,默认会调用__get__方法,但是__get__方法没有将实例返回,因此,Stduent2.stu1.course会报错 stu2 = Stduent2() print(stu2.stu1.course) # 一样的报错 # 示例 引入描述器 class Stduent1: def __init__(self): self.course = 'Python' print('Stduent1.__init__') def __get__(self, instance, owner): # 这里的self为Stduent1的实例. instance为实例, 如果是类访问,那么instance为None. owner是调用者的类 print('self={} instance={} owner={}'.format(self, instance, owner)) return self # 返回Student1的实例self class Stduent2: stu1 = Stduent1() def __init__(self): print('Stduent2.__init__') print(Stduent2.stu1.course) stu2 = Stduent2() print(stu2.stu1.course)
2、数据描述器
数据描述器,针对类属性和实例属性都产生作用。当访问或者修改此属性时,将调用相应的__get__或者__set__方法。
# 示例1: class Student1: def __init__(self): self.course = 'Python' print('Student1.__init__') def __get__(self, instance, owner): # 这里的self为Student1的实例. instance为实例, 如果是类访问,那么instance为None. owner是调用者的类 print('self={} instance={} owner={}'.format(self, instance, owner)) return self # 返回Student1的实例self class Student2: stu1 = Student1() def __init__(self): print('Student2.__init__') self.y = Student1() # 没有调用__get__方法 print(Student2.stu1.course) stu2 = Student2() print(stu2.y) # 示例,数据描述器 class Student1: def __init__(self): self.course = 'Python' print('Student1.__init__') def __get__(self, instance, owner): print('self={} instance={} owner={}'.format(self, instance, owner)) return self def __set__(self, instance, value): print('self={} instance={} value={}'.format(self, instance, value)) self.course = value class Student2: stu1 = Student1() def __init__(self): print('Student2.__init__') self.y = Student1() # 调用了__get__方法 print(Student2.stu1.course) stu2 = Student2() print(stu2.stu1)
以上就是python描述器的分类详解,看完本篇的文章后,相信大家已经能够对描述器的类型进行区分。非数据描述器只作用类属性这点,大家一定不要忘记了哦。
相关教程
-
如何删除python字典中的元素?如何清空字典?
讲述了如何删除python字典中的元素
发布时间:2019-07-11
-
使用Python开发SQLite代理服务器的方法
今天小编就为大家分享一篇使用Python开发SQLite代理服务器的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
发布时间:2019-06-03