服务器之家

服务器之家 > 正文

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

时间:2021-11-14 10:39     来源/作者:简单生活,简单爱

描述符类要求:

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

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

?
1
2
3
4
5
6
7
8
•__get__(self, instance, owner)
–用于访问属性,它返回属性的值
 
•__set__(self, instance, value)
–将在属性分配操作中调用,不返回任何内容
 
•__delete__(self, instance)
–控制删除操作,不返回任何内容

eg:

?
1
2
3
4
5
6
7
8
9
>>> 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:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
>>> 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

要求:

•先定义一个温度类,然后定义两个描述符类用于描述摄氏度和华氏度两个属性。
•要求两个属性会自动进行转换,也就是说你可以给摄氏度这个属性赋值,然后打印的华氏度属性是自动转换后的结果。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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

到此这篇关于详解python魔法方法之描述符类的文章就介绍到这了,更多相关python描述符类内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/u011436427/article/details/117231948

相关文章

热门资讯

yue是什么意思 网络流行语yue了是什么梗
yue是什么意思 网络流行语yue了是什么梗 2020-10-11
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全 2019-12-26
背刺什么意思 网络词语背刺是什么梗
背刺什么意思 网络词语背刺是什么梗 2020-05-22
2021年耽改剧名单 2021要播出的59部耽改剧列表
2021年耽改剧名单 2021要播出的59部耽改剧列表 2021-03-05
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总 2020-11-13
返回顶部