详解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
测试:
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


猜你喜欢
- String slctpsql="select id ,"+uid+","+ddd+",&
- 最近有个需求,用多线程比较合适,但是我需要每个线程的返回值,这就需要我在threading.Thread的基础上进行封装import thr
- Sql中in和not in中有null值的情况1)in的逻辑规则是or not in 的逻辑规则是 and2)判断null 的sql语句为
- 当 Yii框架仍处于 RC(候选版)阶段时,我们 对它进行过报道,那时它刚刚全面达到候选版本阶段,(现在它已经发布了正式版本)我们感觉是时候
- 用django框架来做一些后台管理的web页面简直太方便了,django自带模块级的权限系统,用来做一些内部的系统非常合适,可以大大的减少开
- 图像在计算机中的存储图像其实就是一个像素值组成的矩阵。1、黑白或灰度图像如何存储在计算机中在这里,我们已经采取了黑白图像,也被称为一个灰度图
- 如下所示:import serialimport timet = serial.Serial('com6', 115200)
- 最近帮朋友做了点东西,最后需要将结果在网页中展示,这就需要搭建个服务器,做几个网页把数据信息展示出来。网上找了一下,阿里腾讯都有租服务器的业
- rstrip()方法返回所有字符都被去除的字符串(缺省为空格字符)结束字符串的副本。语法以下是rstrip()方法的语法:str
- 知道如何快速在命令行或者python脚本中实例化一个浏览器通常是非常有用的。每次我需要做任何关于web的自动任务时,我都使用这段python
- 前言:网上找的地铁线路图大多数都不太清晰,而且有水印,对本人这种视力不好的人来说看起来是真的不方便。所以能不能制作属于自己的地铁线路图呢?好
- 在Windows平台上, js可以调用很多Windows提供的ActivexObject,本文就使用js来实现文档处理, 和使用js编写Ac
- 方法1: X:\oracle\ora81\bin\wrap iname=XXX oname=XXX 方法2:9i在win2000下使用wra
- 获取文件目录的方法 :import os# '***获取当前目录***'os.getcwd()# '***获取上级目
- 自己在学习过程中也遇到了类似的问题:比如,后台是想做成这样子的:但是实际则是这样的:解决方法:通过隐藏表单控件<input type=
- 以一个toggle按钮控制p元素显隐为例,如果不使用过渡效果,则如下所示<div id="demo"> &l
- 本文实例为大家分享了js实现固定区域内的不重叠随机圆,供大家参考,具体内容如下关键词:js、固定区域、不重叠、随机圆,半径固定、半径随机最近
- 1.创建空字典>>> dic = {}>>> type(dic)<type 'dict
- 显示图像是 Opencv最基本的操作之一, imshow()函数可以实现该操作。如果使用过其他GUI框架背景,就会很自然地调用 imshow
- 学过Python的人应该都知道,Python是支持多线程的,并且是native的线程。本文主要是通过thread和threading这两个模