神奇的描述符(二):使用描述符实现实例属性的类型检查

因为描述符本身可以接管实例属性的访问,利用这个特点,可以使用描述符来实现一些实例属性的类型检查工作。

先定义一个描述符 Point,用于管理坐标信息。

class Point:

    def __init__(self, name):
        self.name = name

    def __get__(self, instance, owner):
        # 通常情况下,通过类属性访问描述符时,返回描述符自身
        if instance is None:
            return self
        # 通过实例属性访问描述符时,返回实例
        else:
            return instance.__dict__[self.name]

    def __set__(self, instance, value):
        try:
            # 检查坐标格式是否有异常
            x, y = value
            instance.__dict__[self.name] = x, y
        except TypeError:
            raise TypeError(‘无效的坐标信息‘)

定义一个Address类,及类属性home,home接收一个坐标信息

class Address:

    home = Point(‘myhome‘)

实例化Address,并对实例属性进行赋值

addr = Address()
# 将坐标信息赋值给home
addr.home = 123, 321
print(addr.home)
# (123, 321)

# 错误的赋值
addr.home = 123
# TypeError: 无效的坐标信息

第一次,赋值给home一个正确的坐标信息: 123, 321,符合point的赋值要求,并且能通过 addr.home 读取。

第二次,赋值给home 一个 int 类型的变量 123,因为描述符会接管实例属性的读写,所以在赋值时,执行的是Point描述符的 __set__ 的方法,在对 value 进行解包时,int 类型无法解包,引发

TypeError异常,赋值失败,达到了对实例属性进行类型检查的效果。

时间: 2024-09-30 11:36:34

神奇的描述符(二):使用描述符实现实例属性的类型检查的相关文章

python类与对象-如何使用描述符对实例属性做类型检查

如何使用描述符对实例属性做类型检查 问题举例 在某些项目中,我们实现一些类,并希望能像静态类型语言那样对它们的 实例属性做类型检查: p = Persosn() p.name = 'tom' #必须是str p.age = 18       #必须是int 要求: (1)可对实例属性指定类型 (2)赋予不正确类型时抛出异常 分析 class A(): pass a = A() #a.x = 'hello' #a.__dict__['x'] = 'hello' a.x = 'hello'等价于a.

ES5 数据属性描述符和存取描述符

一.数据属性描述符 对象是一个属性集合,对象的基本特征是属性名(name)和属性值(value).ES5 增加了属性描述符,可以更细腻的控制属性的不同操作.属性描述符有 configurable.writable 和 enumerable. 属性描述符通常和 Object.defineProperty/Object.defineProperties 一起使用来定义属性,它也会受到诸如 Object.freeze/Object.seal 等方法改变. 1. configurable 当且仅当 co

usb协议分析-设备描述符配置包-描述符

/* usb协议分析仅供大家参考---设备描述符配置包,设备描述符, 地址设置, 配置描述符, 字符串描述符 */ /* -1- usb设备描述符配置包 */ typedef struct _USB_SETUP_PACKET { REQUEST_TYPE bmRequestType; BYTE bRequest; WORD_BYTE wValue; WORD_BYTE wIndex; WORD wLength; } USB_SETUP_PACKET; 1.bmRequestType 是包含有下面

寻找实体上SaleOrgId对应的属性描述符失败,实体不存在此属性!

表达式计算出错: FSaleOrgId.FNumber == '105' ( 寻找实体上SaleOrgId对应的属性描述符失败,实体不存在此属性![EntityType:SaleOrderFinance Propeyties:Id LocalCurrId_Id LocalCurrId ExchangeTypeId_Id ExchangeTypeId ExchangeRate PayAdvanceRate PayAdvanceAmount DiscountListId_Id DiscountLis

@修饰符 二

修饰符基础——闭包 什么是闭包呢?标准的概念大家可以看wikipedia上的解释点击打开链接   举个例子: [python] view plain copy def do_add(base): def add(increase): return base + increase return add do_add函数里嵌套了一个内层函数add,这个内层函数就是一个闭包,其实可以也不用管这个“闭包”的概念,先来看下这种模式解决些什么问题. 调 用do_add函数:a = do_add(23),由于

2016 2 - 23 arc中的所有权修饰符(_strong修饰符与_weak修饰符)

一 _strong修饰符 1._strong修饰符是id类型和对象类型默认的所有权修饰符.如下: id obj = [[NSObject alloc] init];//在没用明确变量所有权修饰符时,会被默认被_strong修饰符 id _strong obj = [[NSObject alloc] init];//此段代码上面的是相同的. 2. 如strong这个名字所示,_strong修饰符表示对对象的强引用.持有强引用的变量在超出其作用域时会被废弃.随着强引用的失效,引用的对象会随之失效.

访问修饰符与可选修饰符static的使用

在Java中修饰符较多,在这里简单说一说几个访问修饰符的选择使用,和可选修饰符static的使用. 一.访问修饰符:这是Java里用来控制访问类及类的方法.变量的访问权限,从而达到只暴露接口,来隐藏内部实现的细节,访问控制符分4种级别(仅仅适用于类及类的成员修饰  private.默认.protected.public),接下来用一个表的形式简要介绍它们的选用:      本 类 同 包 不同包 子 类 非 子 类 子 类 非 子 类 private √ × × × × 默认 √ √ √ × ×

Windows、Unix、Mac不同操作系统的换行问题-剖析回车符\r和换行符\n

转载链接:http://blog.csdn.net/tskyfree/article/details/8121951 一.概念: 换行符‘\n’和回车符‘\r’ (1)换行符就是另起一行  --- '\n' 10 换行(newline) (2)回车符就是回到一行的开头 --- '\r' 13 回车(return) 所以我们平时编写文件的回车符应该确切来说叫做回车换行符     二.应用: (1)在微软的MS-DOS和Windows中,使用“回车CR('\r')”和“换行LF('\n')”两个字符

别说你懂修饰符——深入分析Java修饰符

我想学习Java的朋友应该都在学习的路上遇到过这样的疑问,Java中的修饰符,对public,private,protected还算熟悉, 可是对final,static等就不太清楚了,对Java中类,方法,变量的默认修饰符好像就更不了解了,我们今天就和大家一起 学习一下,Java中各种各样奇妙的修饰符. 一.范围介绍 首先,我们要明白在Java中修饰符的作用主要有两种,一种是用来控制访问权限的,另一种是用来控制其他方面的(比如值是否可改,访问的方式,是否可覆盖等等).而,在访问权限方面,一般分