iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python使用描述符实现属性类型检查的案例解析
  • 655
分享到

Python使用描述符实现属性类型检查的案例解析

2024-04-02 19:04:59 655人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

目录1、如何使用描述符对实例属性做类型检查?实际案例:解决方案:2、代码演示1、如何使用描述符对实例属性做类型检查? 实际案例: 在某项目中,我们实现了一些类,并希望能像静态类型语言

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会被传入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'

到此这篇关于Python使用描述符实现属性类型检查的文章就介绍到这了,更多相关python属性类型检查内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Python使用描述符实现属性类型检查的案例解析

本文链接: https://www.lsjlt.com/news/117999.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作