详解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之list和str比较
Sep 20 Python
Python内置函数Type()函数一个有趣的用法
Feb 18 Python
Python注释详解
Jun 01 Python
浅谈Python中重载isinstance继承关系的问题
May 04 Python
pandas使用get_dummies进行one-hot编码的方法
Jul 10 Python
对pandas通过索引提取dataframe的行方法详解
Feb 01 Python
python实现可逆简单的加密算法
Mar 22 Python
Python内置random模块生成随机数的方法
May 31 Python
python聚类算法解决方案(rest接口/mpp数据库/json数据/下载图片及数据)
Aug 28 Python
如何使用python传入不确定个数参数
Feb 18 Python
pycharm的python_stubs问题
Apr 08 Python
接口自动化多层嵌套json数据处理代码实例
Nov 20 Python
使用tensorflow 实现反向传播求导
python基础学习之递归函数知识总结
TensorFlow的自动求导原理分析
Django分页器的用法你都了解吗
May 26 #Python
tensorflow中的梯度求解及梯度裁剪操作
May 26 #Python
python numpy中multiply与*及matul 的区别说明
May 26 #Python
python文本处理的方案(结巴分词并去除符号)
You might like
php中3des加密代码(完全与.net中的兼容)
2012/08/02 PHP
php中jpgraph类库的使用介绍
2013/08/08 PHP
php批量更改数据库表前缀实现方法
2013/10/26 PHP
php使用 readfile() 函数设置文件大小大小的方法
2017/08/11 PHP
php设计模式之模板模式实例分析【星际争霸游戏案例】
2020/03/24 PHP
解决PhpStorm64不能启动的问题
2020/06/20 PHP
jquery1.4后 jqDrag 拖动 不可用
2010/02/06 Javascript
JQuery团队打造的javascript单元测试工具QUnit介绍
2010/02/26 Javascript
原生js实现给指定元素的后面追加内容
2013/04/10 Javascript
js中top的作用深入剖析
2014/03/04 Javascript
js获取客户端网卡的IP地址、MAC地址
2014/03/26 Javascript
JavaScript整除运算函数ceil和floor的区别分析
2015/04/14 Javascript
JavaScript将字符串转换为整数的方法
2015/04/14 Javascript
轻松学习jQuery插件EasyUI EasyUI创建树形网络(1)
2015/11/30 Javascript
JavaScript用构造函数如何获取变量的类型名
2016/12/23 Javascript
详解RequireJS按需加载样式文件
2017/04/12 Javascript
源码分析Vue.js的监听实现教程
2017/04/23 Javascript
angular4中关于表单的校验示例
2017/10/16 Javascript
VeeValidate在vue项目里表单校验应用案例
2018/05/09 Javascript
小程序登录态管理的方法示例
2018/11/13 Javascript
详解vite+ts快速搭建vue3项目以及介绍相关特性
2021/02/25 Vue.js
python使用win32com在百度空间插入html元素示例
2014/02/20 Python
Python 序列化 pickle/cPickle模块使用介绍
2014/11/30 Python
Python3访问并下载网页内容的方法
2015/07/28 Python
Python文件操作之合并文本文件内容示例代码
2017/09/19 Python
EM算法的python实现的方法步骤
2018/01/02 Python
python 求某条线上特定x值或y值的点坐标方法
2019/07/09 Python
Python单例模式的四种创建方式实例解析
2020/03/04 Python
python批量生成条形码的示例
2020/10/10 Python
利用python查看数组中的所有元素是否相同
2021/01/08 Python
HTML5 canvas 基本语法
2009/08/26 HTML / CSS
英国No.1体育用品零售商:SportsDirect.com
2019/10/16 全球购物
工业自动化专业毕业生推荐信
2013/11/18 职场文书
招商业务员岗位职责
2013/12/16 职场文书
税务干部鉴定材料
2014/02/11 职场文书
Tomcat项目启动失败的原因和解决办法
2022/04/20 Servers