zoukankan      html  css  js  c++  java
  • Python3 的描述符--完整例子详细解释

    ##描述符类的例子,这个例子说明了描述符和被描述符之间的关系

    ##摄氏温度

    class Celsius():      ## 1 描述符类                                         
        def __init__(self,value = 26.0):   ## 2摄氏温度值初始化赋值
            self.value = float(value)      ## 3
        def __get__(self,instance,owner):  ## 4
            return self.value              ## 5
        def __set__(self,instance,value):  ##6
            self.value = float(value)      ##7

    ##华氏温度

    class Fahrenheit():                    ## 8 描述符类
        def __get__(self,instance,owner):  ##  8.1
            return instance.cel * 1.8 +32  ## 9
        def __set__(self,instance,value):  ## 10
            instance.cel = (float(value)-32)/18  ##11

    ##被描述的类

    class Temperature():     ## 12 被描述符类
        cel = Celsius()      ## 13 描述符类指派到被描述符类的对象
        fah = Fahrenheit()   ## 14 描述符类指派到被描述符类的对象

    ###输入输出结果演示

    >>> temp = Temperature() #15
    >>> temp.cel             #16
    26.0                     #17
    >>> temp.cel = 30        #18
    >>> temp.fah             #19
    86.0                     #20
    >>> temp.fah =  100      #21
    >>> temp.cel             #22
    3.7777777777777777       #23
    >>>                     

    ###解释这一段代码, 
    '''首先解释这个程序代码:上边的摄氏温度和华氏温度都是描述符,都是对下边的那个被描述符类进行
    描述的,描述的是他的属性cel fah 这两个属性参数。这里边的属性关系13 14 两个语句是对被描述符
    的两个属性的相当于赋值相当于实例化的一个操作,那么cel 和fah 这两个被描述符的属性就相当于是
    描述符Celsius()和Fahrenheit()的实例化对象了。
    现在根据输入输出来解释实际操作时的一些问题,当输入15的时候,就是被描述符的一个实例化。16就
    是对实例化对象也就是被描述对象的属性访问,这时注意到13这个属性又被Celsius()所描述,那么就会
    回到1处,Celsius()描述符类中有2,那么就会初始化一个值,传过去就是属性的值cel.value = 26.0,
    那么接下来16就是被描述对象访问属性,这个属性值是26.0.
    那么18就很明显就是对被描述对象的赋值了,娜美被描述对象的cel属性就是30,此时13句就起到了作用
    就是说属性cel被赋值,那么对这个属性的就进行操作了,赋值操作就是Celsius()描述符类的__set__
    操作,那就是语句6,得到cel.value = 30 ,接下来输入输出结果中19句的由来就是,由于6句的处理得到
    cel.value = 30,然后到8,也就是对被描述符对象的属性fah进行访问,那么就是到Fahrenheit()中的
    8.1进行获取的操作,获取操作9,instance是实例化对象拥有者temp,那么9的公式就是返回temp.cel * 1.8 +32
    而temp.cel 在18的时候经过操作已经赋值为30,所以这里的返回值就是计算的结果86.0,。同理接下来的输入输出
    结果的内容结束的方式和上边的解释思想是一样的。

    注:初学者难免会有理解不对和理解不到位的地方,还望大家批评指正,谢谢!

  • 相关阅读:
    bzoj 3779: 重组病毒【LCT+线段树维护dfs序】
    bzoj 4817: [Sdoi2017]树点涂色【树链剖分+LCT】
    bzoj 4818: [Sdoi2017]序列计数【容斥原理+dp+矩阵乘法】
    bzoj 1853: [Scoi2010]幸运数字&&2393: Cirno的完美算数教室【容斥原理】
    bzoj 3589: 动态树【树链剖分+容斥】
    bzoj 1042: [HAOI2008]硬币购物【容斥原理+dp】
    bzoj 4517: [Sdoi2016]排列计数【容斥原理+组合数学】
    好听的英文歌曲
    颜色色环
    颜色模式
  • 原文地址:https://www.cnblogs.com/loved/p/8668427.html
Copyright © 2011-2022 走看看