Python描述符有什么妙用,如何对实例属性做类型检查
Admin 2022-09-01 群英技术资讯 482 次浏览
在某项目中,我们实现了一些类,并希望能像静态类型语言那样(C,C++,Java)对它们的实例属性做类型检查。
p = Person() p.name = 'Bob' # 名字属性必须是str p.age = 18 # 年龄必须是int p.height = 1.83 # 身高必须是float
要求:(1)可以对实例变量名指定类型
(2)赋予不正确类型时抛出异常
使用描述符来实现需要类型检查的属性:分别实现__get__, __set__,__delete__方法,在__set__内使用isinstance函数做类型检查。
拓展:静态类型语言变量只能引用一种确定类型的对象并且不能改变。类型检查是由编译器在编译阶段完成的,对于Python动态类型语言来讲一个变量可以引用任意类型的对象并且可以实时发生改变,也就是解释器不能完成类型检查,只能自己去实现。
什么是描述符?描述符就是包含__get__, __set__,__delete__这样方法的类,这三个方法只要包含其中一个那它就是描述符。
实例属性就是在一个类中将另一个类的实例作为该类的一个数属性。
(1)描述符定义和访问流程介绍
class Descriptor(object): def __get__(self, instance, cls): # instance用于区分使用类访问x,还是使用实例访问x print('in __get__', instance, cls) return instance.__dict__['x'] def __set__(self, instance, value): # 在set中对于类型进行检查 print('in __set__') instance.__dict__['x'] = value def __delete__(self, instance): print('in __del__') class A(object): # 在类中定义一个类属性x x = Descriptor() a = A() # 会被Descriptor的__get__方法所截获 print(a.x) # 直接使用类A访问类属性,instance会被传入None print(A.x) # 会被Descriptor的__set__方法所截获 a.x = 5 # 会被Descriptor的__del__方法所截获 del a.x ''' 通常来说在描述符这些方法当中访问的是instance.__dict__这个字典, 也就是对于它的真正属性进行操作。 ''' a = A() a.x = 5 print(a.__dict__)
(2)实现使用描述符检查实例属性类型
class Attr(object): def __init__(self, name, type_): self.name = name self.type_ = type_ def __get__(self, instance, cls): return instance.__dict__[self.name] def __set__(self, instance, value): # 对字段类型做检测 if not isinstance(value, self.type_): raise TypeError('expected an %s' % self.type_) instance.__dict__[self.name] = value def __delete__(self, instance): del instance.__dict__[self.name] class Person(object): # 定义一个name字段,申请描述符实例 name = Attr('name', str) age = Attr('age', int) height = Attr('height', float) p = Person() p.name = 'Bob' print(p.name) # age赋值字符串类型抛出异常错误 # p.age = '17'
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
这篇文章主要介绍了Python实现的文本编辑器功能,结合实例形式详细分析了基于wxpython实现文本编辑器所需的功能及相关实现技巧,需要的朋友可以参考下
本文主要介绍了opencv中颜色空间转换函数cv2.cvtColor()使用,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
第一种,利用functools工具,调用reduce()函数求阶乘。||第二种,使用for循环来求阶乘。||第三种,直接定义一个阶乘函数func(),利用递归的方式来求阶乘即可。
这篇文章主要介绍了Python标准库time使用方式详解,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的朋友可以参考一下
这篇文章主要介绍了Python 中的反转字符串reversed(),切片 ,以相反的顺序反转和处理字符串可能是编程中的一项常见任务。Python 提供了一组工具和技术,可以帮助我们快速有效地执行字符串反转,下面来看看具体内容吧
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008