Python描述符有什么妙用,如何对实例属性做类型检查
Admin 2022-09-01 群英技术资讯 904 次浏览
在某项目中,我们实现了一些类,并希望能像静态类型语言那样(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如何使用contextvars模块源码分析,contextvars是Python3.7后的官方库,功能就是可以为多线程以及asyncio生态添加上下文功能,即使程序在多个协程并发运行的情况下,也能调用到程序的上下文变量, 从而使我们的逻辑解耦
大家好,本篇文章主要讲的是用python画圣诞树三种代码示例介绍,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
所谓函数,就是把具有独立功能的代码块组织成为一个小模块,在需要的时候调用函数的使用包含两个步骤 :
其实关于YOLOv5的网络结构其实网上相关的讲解已经有很多了,但是觉着还是有必要再给大家介绍下,下面这篇文章主要给大家介绍了关于YOLOv5中SPP/SPPF结构源码的相关资料,需要的朋友可以参考下
大家应该都知道redis是一个基于内存的高效的键值型非关系数据库,下面这篇文章主要给大家介绍了关于Python操作Redis的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008