• Python3 魔法方法:描述符(property的实现原理)


    1、描述符

    用一个类来描述另一个类的属性,而描述这个属性的类必须实现__get__ __set__ __delete__ 其中一个魔法方法,那么这个描述属性的类被称为描述符

    简而言之,描述符就是将某种特殊类型(包含__get__ __set__ __delete__)的类指派给另一个类的属性

    2、魔法方法

    __get__(self,instance,owner)# owner 是包含描述符的类, instance 是包含描述符的类实例化的对象

    用于访问属性,返回属性的值

    __set__(self,instance,value)

    用于属性分配操作中调用,不返回任何值

    __delete__(self,instance)

    定义描述符值被删除的行为,不返回值

    例子:定义一个温度类,使用描述符,实现摄氏度和华氏度的任意转换

    class Celsius:
        def __init__(self,value=26.0):
            self.value=value
            
        def __get__(self,instance,owner):
            #print(self,instance,owner)
            return self.value
            
        def __set__(self,instance,value):
            self.value=value
    
    
    class Fahrenheit:
        
        def __get__(self,instance,owner):
            #print(instance)
            return instance.cel*1.8+32
    #instance时Temperature实例化的对象a,owner为Temperature这个类
        
        def __set__(self,instance,value):
            instance.cel=(value-32)/1.8
            
        
    
            
            
    class Temperature:
        cel=Celsius()
        fah=Fahrenheit() 
    a=Temperature()

    定义一个描述符Record描述符,记录指定变量读取和写入操作并保存为文件record.txt

    import time
    import os
    class Record:
        def __init__(self,value,name):
            os.chdir(os.getcwd())
            self._value=value
            self._name=name
        def __get__(self,instance,owner):
            file=open('record.txt','a')
            TIM=time.strftime("%c")
            file.write('%s 变量于北京时间 %s 被读取, %s = %d
    '%(self._name,TIM,self._name,self._value))
            file.close()
            return self._value
    
        def __set__(self,instance,value):
            self._value=value        
            file=open('record.txt','a')
            TIM=time.strftime("%c")
            file.write('%s 变量于北京时间 %s 被修改, %s = %s
    '%(self._name,TIM,self._name,self._value))
            file.close()
    
    class Test:
        x = Record(10,'x')
        y = Record(8.8,'y')
    
    
    test=Test()

    定义一个描述符MyDes描述符,用pkl文件来存储相应属性,属性被删除时文件也被删除

    import pickle as p
    import os
    class MyDes:
        save=[]
        def __init__(self, name):
            os.chdir(os.curdir)
            self._name=name
        def __get__(self,instance,owner):
            if self._name not in self.save:
                raise AttributeError("%s属性还没赋值"%self._name)
            else:
                return self.value
        def __set__(self,instance,value):
            self.save.append(self._name)
            self.value=value
            file=open((self._name+'.pkl'),'wb')
            p.dump(value,file)
            file.close()
        def __delete__(self,instance):
            os.remove((self._name+'.pkl'))
            self.save.remove(self._name)
            
            
    class Test:
        x = MyDes('x')
        y = MyDes('y')
    
    test=Test()
  • 相关阅读:
    物理机和虚拟机互相可以ping通,还是无法连接
    CentOS 7: ping Name or service not known
    Ubuntu上安装搜狗输入法(sogou)
    成功安装 tesserocr
    The following untracked working tree files would be overwritten by merge
    切换本地凭据(Windows上登录的GitHub账号)
    配置了SSH后还是每次都要求输入密码
    dpkg dependency problems prevent configuration
    mui 设置应用全屏模式
    解决烦人的缓存问题!
  • 原文地址:https://www.cnblogs.com/PythonFCG/p/8436676.html
Copyright © 2020-2023  润新知