详解Python魔法方法之描述符类


Posted in Python onMay 26, 2021

描述符类要求:

描述符就是将某种特殊类型的类的实例指派给另一个类的属性

至少要实现以下的一个方法:

•__get__(self, instance, owner)
?用于访问属性,它返回属性的值

•__set__(self, instance, value)
?将在属性分配操作中调用,不返回任何内容

•__delete__(self, instance)
?控制删除操作,不返回任何内容

eg:

>>> class MyDecriptor:
    def __get__(self,instance,owner):
        print("getting...",self,instance,owner)
    def __set__(self,instance,value):
        print("setting...",self,instance,value)
    def __delete__(self,instance):
        print("deleting...",self,instance)
>>> class Test:
    x = MyDecriptor()   #取Mydecriptor类的实例指派给Test类的属性x

测试:

详解Python魔法方法之描述符类

eg:

>>> class MyProperty:
    def __init__(self,fget = None,fset = None,fdel = None):
        self.fget = fget
        self.fset = fset
        self.fdel = fdel
    def __get__(self,instance,owner):
        return self.fget(instance)
    def __set__(self,instance,value):
        self.fset(instance,value)
    def __delete__(self,instance):
        self.fdel(instance)

        
>>> class C:
    def __init__(self):
        self._x = None
    def getX(self):
        return self._x
    def setX(self,value):
        self._x = value
    def delX(self):
        del self._x
    x = MyProperty(getX,setX,delX)

    
>>> c = C()
>>> c.x = "HELLOW"
>>> c.x
'HELLOW'
>>> c._x
'HELLOW'
>>> del c.x
>>> c._x

eg:

摄氏度转华氏度:华氏度=摄氏度*1.8+32

要求:

•先定义一个温度类,然后定义两个描述符类用于描述摄氏度和华氏度两个属性。
•要求两个属性会自动进行转换,也就是说你可以给摄氏度这个属性赋值,然后打印的华氏度属性是自动转换后的结果。

ss Celsius:  #摄氏度描述符类
    def __init__(self,value = 26.0):#self为描述符类自身(此为摄氏度描述符类)的实例(此为cel)
        self.value = float(value)
    def __get__(self,instance,owner):#instance是这个描述符的拥有者所在的类的实例(此为temp)
        return self.value
    def __set__(self,instance,value):#owner是这个描述符的拥有者所在的类本身(此为温度类)
        self.value = float(value)

class Fahrenheit:   #华氏度描述符类
    def __get__(self,instance,owner):
        return instance.cel * 1.8 +32  #摄氏度转华氏度
    def __set__(self,instance,value):
        instance.cel = ((float)(value)- 32)/ 1.8 
        ## instance.cel 则会执行Temperature.cel,接着执行Celsius类中的__set__方法
        
class Temperature:   #温度类
    cel = Celsius()   #设置摄氏度属性(描述符类的实例指派给了温度类的属性)
    fah = Fahrenheit()# temp.fah ,当属性fah被赋值的时候,则会执行Fahrenheit描述符类的__set__方法
						
>>> temp = Temperature()
>>> temp.cel
26.0
>>> temp.fah
78.80000000000001
>>> temp.fah = 78.8
>>> temp.cel
25.999999999999996

到此这篇关于详解Python魔法方法之描述符类的文章就介绍到这了,更多相关python描述符类内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python新手实现2048小游戏
Mar 31 Python
python executemany的使用及注意事项
Mar 13 Python
利用python模拟sql语句对员工表格进行增删改查
Jul 05 Python
使用Python的package机制如何简化utils包设计详解
Dec 11 Python
Python如何爬取实时变化的WebSocket数据的方法
Mar 09 Python
Django框架之DRF 基于mixins来封装的视图详解
Jul 23 Python
Python字符串中添加、插入特定字符的方法
Sep 10 Python
python安装scipy的步骤解析
Sep 28 Python
Python 闭包,函数分隔作用域,nonlocal声明非局部变量操作示例
Oct 14 Python
浅谈python元素如何去重,去重后如何保持原来元素的顺序不变
Feb 28 Python
python单例模式的应用场景实例讲解
Feb 24 Python
忆童年!用Python实现愤怒的小鸟游戏
Jun 07 Python
使用tensorflow 实现反向传播求导
python基础学习之递归函数知识总结
TensorFlow的自动求导原理分析
Django分页器的用法你都了解吗
May 26 #Python
tensorflow中的梯度求解及梯度裁剪操作
May 26 #Python
python numpy中multiply与*及matul 的区别说明
May 26 #Python
python文本处理的方案(结巴分词并去除符号)
You might like
php生成缩略图填充白边(等比缩略图方案)
2013/12/25 PHP
从零开始学YII2框架(六)高级应用程序模板
2014/08/20 PHP
php冒泡排序与快速排序实例详解
2015/12/07 PHP
PHP框架性能测试报告
2016/05/08 PHP
php日期操作技巧小结
2016/06/25 PHP
PHP面向对象程序设计之多态性的应用示例
2018/12/19 PHP
PHP批斗大会之缺失的异常详解
2019/07/09 PHP
Dojo 学习笔记入门篇 First Dojo Example
2009/11/15 Javascript
jquery动画3.创建一个带遮罩效果的图片走廊
2012/08/24 Javascript
拖动table标题实现改变td的大小(css+js代码)
2013/04/16 Javascript
JavaScript实现列出数组中最长的连续数
2014/12/29 Javascript
用window.onerror捕获并上报Js错误的方法
2016/01/27 Javascript
jQuery 获取页面li数组并删除不在数组中的key
2016/08/02 Javascript
Bootstrap CSS使用方法
2016/12/23 Javascript
JS实现的五级联动菜单效果完整实例
2017/02/23 Javascript
AngularJs 禁止模板缓存的方法
2017/11/28 Javascript
手写Vue弹窗Modal的实现代码
2019/09/11 Javascript
jquery实现点击弹出对话框
2020/02/08 jQuery
vue项目在线上服务器访问失败原因分析
2020/08/14 Javascript
electron踩坑之remote of undefined的解决
2020/10/06 Javascript
使用python实现递归版汉诺塔示例(汉诺塔递归算法)
2014/04/08 Python
python实现列表中由数值查到索引的方法
2018/06/27 Python
Flask框架使用DBUtils模块连接数据库操作示例
2018/07/20 Python
django rest framework vue 实现用户登录详解
2019/07/29 Python
在VS2017中用C#调用python脚本的实现
2019/07/31 Python
使用pyhon绘图比较两个手机屏幕大小(实例代码)
2020/01/03 Python
Python通过文本和图片生成词云图
2020/05/21 Python
利用PyTorch实现VGG16教程
2020/06/24 Python
html5中地理位置定位api接口开发应用小结
2013/01/04 HTML / CSS
经济实惠的豪华家具:My-Furniture
2019/03/12 全球购物
J2SDK1.5与J2SDK5.0有什么区别
2012/09/19 面试题
商场消防安全责任书
2014/07/29 职场文书
群众路线查摆问题整改措施
2014/10/10 职场文书
2014年语文教研组工作总结
2014/12/06 职场文书
辩论会主持词
2015/07/03 职场文书
《天净沙·秋思》教学反思三篇
2019/11/02 职场文书