文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Python怎么使用描述符实现属性类型检查

2023-06-30 13:21

关注

这篇“Python怎么使用描述符实现属性类型检查”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Python怎么使用描述符实现属性类型检查”文章吧。

1、如何使用描述符对实例属性做类型检查?

实际案例:

在某项目中,我们实现了一些类,并希望能像静态类型语言那样(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__这样方法的类,这三个方法只要包含其中一个那它就是描述符。

实例属性就是在一个类中将另一个类的实例作为该类的一个数属性。

2、代码演示

(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会被传入Noneprint(A.x)# 会被Descriptor的__set__方法所截获a.x = 5# 会被Descriptor的__del__方法所截获del a.x'''通常来说在描述符这些方法当中访问的是instance.__dict__这个字典,也就是对于它的真正属性进行操作。'''a = A()a.x = 5print(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'

以上就是关于“Python怎么使用描述符实现属性类型检查”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注编程网行业资讯频道。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯