Python使用描述符实现属性类型检查的案例解析
作者:AllardZhao 发布时间:2022-07-30 00:39:15
标签: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会被传入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'
来源:https://blog.csdn.net/qq_37189082/article/details/124739329
0
投稿
猜你喜欢
- 开发工具**Python版本:**3.6.4相关模块:scikit-learn模块;jieba模块;numpy模块;以及一些Python自带
- 对于手动管理内存的语言,比如 C/C++,调用著名的malloc和new函数可以在堆上分配一块内存,这块内存的使用和销毁的责任都在程序员。一
- 开发中偶尔需要判断网络的连通性,没有什么方法比 ping 更直接了当,通常检查网络情况都是运行命令ping www.baidu.com ,查
- asp程序运行速度试验实验:1。作相同的分支条件判断:IF 比 SELECT慢。用以下程序测试:
- PDOStatement::nextRowsetPDOStatement::nextRowset — 在一个多行集语句句柄中推进到下一个行集
- using System; using System.Collections; using System.Configuration; us
- 现在介绍加速网页图形显示速度的六种方法,为你解决这个难题。其最基本的宗旨就是,让你用买鱼的价钱,品尝到熊掌的美味和营养。 1.首先要确定图像
- 一、图像缩略图的编辑图像的缩略图是指把图像按原比例缩小,可作为原图的预览,这在网络速度比较慢时可快速地显示图片的概图。当你的网页上有大型图片
- 生成器(generator)概念生成器不会把结果保存在一个系列中,而是保存生成器的状态,在每次进行迭代时返回一个值,直到遇到StopIter
- MySQL中有很多的基本命令,show命令也是其中之一,在很多使用者中对show命令的使用还容易产生混淆,本文主要介绍了show命令的主要用
- CNN(Convolutional Neural Networks) 卷积神经网络简单讲就是把一个图片的数据传递给CNN,原涂层是由RGB组
- 目的对字符串的每个字符进行处理,其实每个字符(Char)就是一个长度为1的字符串。方法1.使用内建函数list()>>>
- 1.字符串定义# coding:utf-8if __name__ == '__main__': &
- 有些使用Z-Blog的用户询问我,怎么实现我的月光博客首页上这种自动图文混排的版式效果,今天我就详细介绍一下在Z-Blog中实现这种图文混排
- 读取剪贴板上的数据先给大家介绍pandas.read_clipboard,从剪贴板读取文本并传递到Read_csv。pandas.read_
- Python 环境下文件的读取问题,请参见拙文 Python基础之文件读取的讲解这是一道著名的 Python 面试题,考察的问题是,Pyth
- 此处收集的是一些夺人心魄的创意广告牌,巧妙的构思十分值得大家观瞻.......超人归来 superman returnsNespressos
- 将无权点文件转化成邻接矩阵目前点文件是两列Excel代码,在进行复杂网络运算时需要转化成邻接矩阵。我在网上找了一个代码,稍微修改了下,亲测可
- 2。date_default_timezone_set("PRC"); 3。PHP&
- 用python读取excel表中的数据假如说有如下一张存储了数据的excel表,其中x1-x6是特征,y_label是特征对应的类别标签。我