详解Python魔法方法之描述符类
作者:简单生活,简单爱 时间:2023-12-17 04:59:59
描述符类要求:
描述符就是将某种特殊类型的类的实例指派给另一个类的属性
至少要实现以下的一个方法:
•__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
测试:
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
来源:https://blog.csdn.net/u011436427/article/details/117231948
标签:python,描述符类,魔法方法
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
window.location 对象所包含的属性
2024-04-16 10:32:14
python掌握字符串只需这一篇就够了
2023-01-09 03:39:10
asp自动采集程序
2009-02-04 10:11:00
对网站内嵌gradio应用的输入输出做审核实现详解
2023-07-22 08:22:05
![](https://img.aspxhome.com/file/2023/9/62849_0s.jpg)
python数字图像处理实现直方图与均衡化
2021-04-01 14:44:59
![](https://img.aspxhome.com/file/2023/7/120937_0s.png)
在 Python 中使用 MQTT的方法
2022-01-26 12:32:48
![](https://img.aspxhome.com/file/2023/5/90515_0s.png)
18个帮你简化代码的Python技巧分享
2021-08-12 02:41:12
Go语言并发编程 互斥锁详情
2024-02-02 04:58:30
在Golang中使用C语言代码实例
2024-05-25 15:15:46
利用python为PostgreSQL的表自动添加分区
2023-07-07 14:44:58
十步搞定uni-app使用字体图标的方法
2022-12-01 03:52:55
![](https://img.aspxhome.com/file/2023/8/126498_0s.png)
perl哈希的一个实例分析
2023-07-23 21:35:16
Python类的继承、多态及获取对象信息操作详解
2023-09-09 21:27:52
Golang标准库syscall详解(什么是系统调用)
2024-05-28 15:23:35
利用Fn.py库在Python中进行函数式编程
2021-11-14 22:40:38
使用Python实现一个栈判断括号是否平衡
2022-01-04 02:20:29
Python实现将照片变成卡通图片的方法【基于opencv】
2023-06-08 11:32:54
python实现双人版坦克大战游戏
2022-08-30 06:52:57
![](https://img.aspxhome.com/file/2023/0/133540_0s.jpg)
Python实战之ATM取款机的实现
2023-04-23 08:40:25
![](https://img.aspxhome.com/file/2023/3/80643_0s.jpg)
关于python实现requests接口测试的问题
2023-08-27 10:09:18
![](https://img.aspxhome.com/file/2023/4/95844_0s.png)