zoukankan      html  css  js  c++  java
  • 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()
  • 相关阅读:
    mac安装浏览器同步测试工具
    感觉自己不幸福怎么办?
    React组件
    常用的网页加载进度条
    浅析百分百还原网站效果图的可行性分析
    关于后台权限
    第一阶段:Python开发基础 day04  Python基础语法入门--Python基本数据类型
    第一阶段:Python开发基础 day03 Python基础语法入门--Python基础知识
    第一阶段:Python开发基础 Python基础语法入门  day03 课后作业
    第一阶段:Python开发基础 基础语法入门-- day02 编程语言分类
  • 原文地址:https://www.cnblogs.com/PythonFCG/p/8436676.html
Copyright © 2011-2022 走看看