详解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
测试:
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
(资源库 www.zyku.net)
原文链接:https://blog.csdn.net/u011436427/article/details/117231948
您可能感兴趣的文章
- 07-05Linux su命令
- 04-22小米12pro关闭系统更新教程
- 02-09小米11按键震动功能关闭教程
- 09-21微信查看历史状态步骤介绍
- 05-05excel表格中自动生成手机号码
- 02-09selenium在scrapy中的使用代码
- 01-11AR徽常安全-AR徽常安全应用软件功能介
- 03-11Linux修改本机/etc/hosts的hostName后
- 02-13华为mate40pro+设置双击亮屏设置方法
- 12-30小学生故事-小学生故事应用软件功能介
- 04-10红米k40取消按键提示音设置方法
- 01-12照片恢复神器-照片恢复神器应用软件功
- 09-12opporeno6查看WiFi使用情况介绍
- 06-21PHP 301 重定向跳转
- 12-28中教学服-中教学服应用软件功能介绍
- 07-15帝国仿站教程发布于10秒前 1周前 1个
- 09-19微博绿藤市同城热搜在哪
- 12-28oppo手机在哪屏蔽短信通知
- 02-10pygame仿office的页面切换功能(完整代
- 09-19collanote导入pdf方法介绍
最近更新
阅读排行
猜你喜欢
- 03-14华为freebuds4唤醒小艺方法
- 02-24iPhone轻点背面功能禁用步骤方法
- 03-10帝国CMS整合Discuz!7.2方法,完整双向同
- 11-21PHP时间日期函数库
- 03-22阿里云网盘正式开启公测
- 02-07华为nova8手机字体大小修改方法
- 12-27智能抠图精灵-智能抠图精灵应用软件功
- 12-30熊洞智家-熊洞智家应用软件功能介绍
- 09-26韶音骨传导耳机配对蓝牙教程一览
- 10-27OPPOReno7支持指纹解锁吗