详解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

测试:

详解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

来源:https://blog.csdn.net/u011436427/article/details/117231948

标签:python,描述符类,魔法方法
0
投稿

猜你喜欢

  • 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
  • python数字图像处理实现直方图与均衡化

    2021-04-01 14:44:59
  • 在 Python 中使用 MQTT的方法

    2022-01-26 12:32:48
  • 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
  • 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
  • Python实战之ATM取款机的实现

    2023-04-23 08:40:25
  • 关于python实现requests接口测试的问题

    2023-08-27 10:09:18
  • asp之家 网络编程 m.aspxhome.com