详解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编程过程中用单元测试法调试代码的介绍
Apr 02 Python
使用url_helper简化Python中Django框架的url配置教程
May 30 Python
详解Django框架中的视图级缓存
Jul 23 Python
使用python实现tcp自动重连
Jul 02 Python
使用Python从零开始撸一个区块链
Mar 14 Python
python的中异常处理机制
Aug 30 Python
pytorch下使用LSTM神经网络写诗实例
Jan 14 Python
Pytorch模型转onnx模型实例
Jan 15 Python
利用Tensorboard绘制网络识别准确率和loss曲线实例
Feb 15 Python
如何卸载python插件
Jul 08 Python
Python 合并拼接字符串的方法
Jul 28 Python
Python函数对象与闭包函数
Apr 13 Python
使用tensorflow 实现反向传播求导
python基础学习之递归函数知识总结
TensorFlow的自动求导原理分析
Django分页器的用法你都了解吗
May 26 #Python
tensorflow中的梯度求解及梯度裁剪操作
May 26 #Python
python numpy中multiply与*及matul 的区别说明
May 26 #Python
python文本处理的方案(结巴分词并去除符号)
You might like
ajax php传递和接收变量实现思路及代码
2012/12/19 PHP
php统计文章排行示例
2014/03/04 PHP
ThinkPHP模板判断输出Empty标签用法详解
2014/06/30 PHP
php基于SQLite实现的分页功能示例
2017/06/21 PHP
PHP仿tp实现mvc框架基本设计思路与实现方法分析
2018/05/23 PHP
jquery tablesorter.js 支持中文表格排序改进
2009/12/09 Javascript
jquery 常用操作方法
2010/01/28 Javascript
jquery弹出框的用法示例(一)
2013/08/26 Javascript
一个JavaScript函数把URL参数解析成Json对象
2014/09/24 Javascript
JavaScript 弹出子窗体并返回结果到父窗体的实现代码
2016/05/28 Javascript
原生javascript实现的ajax异步封装功能示例
2016/11/03 Javascript
bootstrap可编辑下拉框jquery.editable-select
2017/10/12 jQuery
BACKBONE.JS 简单入门范例
2017/10/17 Javascript
用node-webkit把web应用打包成桌面应用(windows环境)
2018/02/01 Javascript
JavaScript实现的简单Tab点击切换功能示例
2018/07/06 Javascript
手把手带你封装一个vue component第三方库
2019/02/14 Javascript
js字符串处理之绝妙的代码
2019/04/05 Javascript
通过vue手动封装on、emit、off的代码详解
2019/05/29 Javascript
node实现mock-plugin中间件的方法
2019/12/25 Javascript
js实现小时钟效果
2020/03/25 Javascript
攻击者是如何将PHP Phar包伪装成图像以绕过文件类型检测的(推荐)
2018/10/11 Python
使用selenium模拟登录解决滑块验证问题的实现
2019/05/10 Python
Python读取stdin方法实例
2019/05/24 Python
python绘制BA无标度网络示例代码
2019/11/21 Python
解决Python3下map函数的显示问题
2019/12/04 Python
pytorch:model.train和model.eval用法及区别详解
2020/02/20 Python
python使用openpyxl操作excel的方法步骤
2020/05/28 Python
python缩进长度是否统一
2020/08/02 Python
关于Python字符编码与二进制不得不说的一些事
2020/10/04 Python
用纯css3和html制作泡沫对话框实现代码
2013/03/21 HTML / CSS
香港网上花店:FlowerAdvisor香港
2019/05/30 全球购物
定制别致的瑜伽垫:Sugarmat
2019/06/21 全球购物
MIRTA官网:手工包,100%意大利制造
2020/02/11 全球购物
c/c++某大公司的两道笔试题
2014/02/02 面试题
4s店市场专员岗位职责
2014/04/09 职场文书
Redis批量生成数据的实现
2022/06/05 Redis