博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python基础-面向对象-描述符
阅读量:6476 次
发布时间:2019-06-23

本文共 3032 字,大约阅读时间需要 10 分钟。

hot3.png

简介

一般用于代理另外一个类的属性

  • 数据描述符:至少实现了__get__()或__set__()

  • 非数据描述符:没有实现__set__()

优先级从高到低

优先级 内容
1 类属性
2 数据描述符
3 实例属性
4 非数据描述符
5 找不到属性触发__getattr()

__get__()

另外一个类调用一个本类属性时触发

class Describe:    def __get__(self, instance, owner):         print("您触发了__get__方法")class Circus:    name = Describe()P = Circus()P.name
您触发了__get__方法

__set__()

另外一个类为本类属性赋值时触发

# -*- coding:utf8 -*-class Describe:    def __set__(self, instance, value):        print("您触发了__set__方法")class Circus:    name = Describe()P = Circus()P.name = "test"
您触发了__set__方法

__delete__()

另外一个类删除本类属性时触发

# -*- coding:utf8 -*-class Describe:    def __delete__(self, instance):        print("您触发了__delete__方法")class Circus:    name = Describe()P = Circus()del P.name
您触发了__delete__方法

实例

综合实例

# -*- coding:utf8 -*-class Typed:                                #定义描述符的类    def __get__(self, instance,owner):        print('get方法')        print('instance参数【%s】' %instance)        print('owner参数【%s】' %owner)    def __set__(self, instance, value):        print('set方法')        print('instance参数【%s】' %instance)        print('calue参数【%s】' %value)    def __delete__(self, instance):        print('del方法')        print('instance参数【%s】' %instance)class People:                               #定义的类    Name = Typed()                          #定义描述符实现类型检测    def __init__(self,name,age,result):     #定义的类包含三种数据类型        self.Name = name                    #字符串        self.Age = age                      #正整数        self.Ralary = result                #浮点数P = People('小明',18,'64.5')                     #触发 __set__ 方法P.Name                                           #触发 __get__ 方法del P.Name                                       #触发 __delete__方法
set方法instance参数【<__main__.People object at 0x0000020B23103BA8>】calue参数【小明】get方法instance参数【<__main__.People object at 0x0000020B23103BA8>】owner参数【
】del方法instance参数【<__main__.People object at 0x0000020B23103BA8>】

描述符实现类型检测

# -*- coding:utf8 -*-class Typed:                                            #定义类型判断类    def __init__(self,key,expected_type):               #定义默认属性和期望类型        self.key = key        self.expected_type = expected_type    def __set__(self, instance, value):                 #类型判断        if not isinstance(value,self.expected_type):            print('%s 传入的类型不是%s' %(self.key,self.expected_type))            #raise TypeError('%s 传入的类型不是%s' %(self.key,self.expected_type))class People:                                           #定义类型汇总    name=Typed('name',str)                              #类和期望类型    age=Typed('age',int)    salary=Typed('salary',float)    def __init__(self,name,age,salary):                 #集成所有需求的类型        self.name=name        self.age=age        self.salary=salaryp = People('小明', 18, 60.5)p1 = People(15,18,60.5)                                 #模拟名称错误p2 = People('小明','18',60.5)                           #模拟年纪错误p3 = People('小明',18,'60.5')                           #模拟成绩错误
name 传入的类型不是
age 传入的类型不是
salary 传入的类型不是

转载于:https://my.oschina.net/zhaojunhui/blog/1799288

你可能感兴趣的文章
python列表解析和生成表达式浅要说明
查看>>
Java注解Annotation详解
查看>>
C++文件操作 判断文件是否存在和文件大小
查看>>
揭开AS程序的外纱(八) -- 容易被忽视的数组实用功能
查看>>
物理内存低于896M各个区到底是怎么映射的
查看>>
linux下的缓存机制及清理buffer/cache/swap的方法梳理
查看>>
安装和配置 Virtual Server
查看>>
Priority VS Bandwidth
查看>>
携程加入百度系 OTA王座利好呈现
查看>>
学习使用SAMinside心得笔记
查看>>
MySQL深入05-用户管理
查看>>
SQL存储过程中的几个常见设定SET QUOTED_IDENTIFIER/NOCOUNT/XACT_ABORT ON/OFF
查看>>
第一部分:基础知识(第一章)第一个 Silverlight 手机程序
查看>>
Silverlight与Flash区别之一
查看>>
删除恢复Hadoop集群中的DataNode
查看>>
Silverlight 2动态创建矩形对象(附完整源代码)
查看>>
PowerShell中对属性设置别名
查看>>
弹出的ViewController半透明效果
查看>>
OpenCV 3.1.0编译与添加扩展模块
查看>>
从京东技术演进看互联网企业的成长历程
查看>>