网络编程
位置:首页>> 网络编程>> Python编程>> 详解Python魔法方法之描述符类

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

作者:简单生活,简单爱  发布时间:2023-12-17 04:59:59 

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

描述符类要求:

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

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


•__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

0
投稿

猜你喜欢

手机版 网络编程 asp之家 www.aspxhome.com