首页 技术 正文
技术 2022年11月21日
0 收藏 739 点赞 2,731 浏览 1626 个字

描述符介绍

描述符本质就是一个新式类,在这个新式类中,至少要实现了__get__()__set__()__delete__()中的一个。这也被称为描述符协议。

class Myclass(object):     def __get__(self, instance, owner):
'''调用一个属性时触发'''
pass def __set__(self, instance, value):
'''为一个属性赋值时触发'''
pass def __delete__(self, instance):
'''使用del删除属性时触发'''
pass

描述符的作用是用来代理另外一个类的属性的(必须把描述符定义成这个类的类属性,不能定义到构造函数中)

数据描述符

至少实现了__get__()__set__()

class Myclass(object):    def __set__(self, instance, value):
print('set') def __get__(self, instance, owner):
print('get')

非数据描述符

没有实现__set__()

class Myclass(object):    def __get__(self, instance, owner):
print('get')

注1:必须把描述符定义成这个类的类属性,不能为定义到构造函数中

注2:要严格遵循该优先级,优先级由高到底分别是

  1. 类属性
  2. 数据描述符
  3. 实例属性
  4. 非数据描述符
  5. 找不到的属性触发 __getattr__()

例1:利用描述符实现参数类型检测

class Typed(object):    def __init__(self, key, exc_type):
self.key = key
self.exc_type = exc_type def __get__(self, instance, owner):
return instance.__dict__[self.key] def __set__(self, instance, value):
# 先判断类型是否为期望类型,如果不是则报错
if not isinstance(value, self.exc_type):
raise TypeError
instance.__dict__[self.key] = value def __delete__(self, instance):
instance.__dict__.pop(self.key)class Person(object):
name = Typed('name', str)
age = Typed('age', int) def __init__(name, age):
self.name = name
self.age = age

例2:使用描述符自定制property

class Lazyproperty(object):    def __init__(self, func):
self.func = func def __get__(self, instance, owner):
'''使用该方法实现非数据描述符'''
# 当使用类调用属性时,返回自身
if not isinstance:
return self
ret = self.func(instance)
# 如果该属性计算过程较为复杂,可以为实例设置属性,以后就不用重复计算了
# 原因是因为非数据描述符优先级低于实例属性,下次调用的时候会优先从实例属性字典中查找
# 而不会再次调用本方法重复计算
setattr(instance, self.func.__name__, ret)
return retclass Room(object): def __init__(self, name, width, length):
self.name = name
self.width = width
self.length = length @Lazyproperty # 这一步相当于定义了一个类属性 -> area = Lazyproperty(area)
def area(self):
return self.width * self.length
相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,077
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,552
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,400
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,176
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,813
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,896