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

Posted warms

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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\n%(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\n%(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()

 

以上是关于Python3 魔法方法:描述符(property的实现原理)的主要内容,如果未能解决你的问题,请参考以下文章

Python基础——魔法方法

Python基础——魔法方法

Python046--魔法方法:描述符

python3 私有化 属性property

python 描述符 上下文管理协议 类装饰器 property metaclass

property 和 魔法方法