第046讲: 魔法方法:描述符(Property的原理) | 学习记录(小甲鱼零基础入门学习Python)

(标答出处: 鱼C论坛)
《零基础入门学习Python》

本章知识点:

◇描述符就是将某种特殊类型的类的实例指派给另一个类的属性
◇属性方法:
(1)__ get __ (self,instance,owner)
(2)__ set __ (self,instance,value)
(3)__ delete__ (self,intance)

例子and练习:
**·**先定义一个温度类,然后定义两个描述符用于描述摄氏度和华氏度两个属性。
**·**要求两个属性会自动进行转换,也就是说你可以给摄氏度这个属性赋值,然后答疑的华氏度属性是自动转换后的结果。

class Centigrade :
    def __init__ (self , value = 26.0) :
        self.value = float(value)

    def __get__ (self,instance,owner) :
        return self.value

    def __set__ (self,instance,value) :
        self.value = float(value)

    def __delete__ (self,intance) :
        del self.value

class Fahrenheit :
    def __get__ (self,instance,owner) :
        return instance.cen * 1.8 +32

    def __set__ (self,instance,value) :
        instance.cen = float(value - 32) / 1.8

class Temperature :
    cen = Centigrade()
    fah = Fahrenheit()

temp = Temperature()
print (temp.cen)
temp.cen = 38
print (temp.fah)
temp.fah = 108
print (temp.cen)

运行结果:
在这里插入图片描述
测试题(笔试,不能上机哦):

在这里插入图片描述
答:有时候,某个应用程序可能会有一个相当微妙的需求,需要你设计一些更为复杂的操作来响应(例如每当属性被访问时,你也许像创建一个日志记录)。最好的解决方法就是编写一个用于执行这些 “更复杂的操作” 的特殊函数,然后指定他在属性被访问时运行。那么一个具有这种函数的对象被称之为描述符。

简单说,描述符就是一个类,一个至少实现__ get __ (self,instance,owner)、__ set __ (self,instance,value)、__ delete__ (self,intance) 三种特殊方法中任意一个的类。
在这里插入图片描述
答:通过三个魔法方法来对属性的get、set和delete进行操作
__ get __ (self,instance,owner)
__ set __ (self,instance,value)
__ delete__ (self,intance)
在这里插入图片描述
答:都会打印 getting ,因为 x = a 等同于把 MyDes() 赋值给了 x 。
在这里插入图片描述
答: 会打印如下:
20
0
在这里插入图片描述
答:9 (错误!!!!)
在这里插入图片描述
动动手
在这里插入图片描述

class MyDes() :
    def __init__(self,value,duixiang) :
        self.duixiang = duixiang
        self.value = value

    def __get__(self,isinstance,owner) :
        print ('正在获取变量:%s' %self.duixiang)
        return self.value

    def __set__(self,isinstance,value) :
        print('正在修改变量:%s' %self.duixiang)
        self.value = value

    def __delete__(self,isinstance) :
        print ('正在删除变量:%s' %self.duixiang)
        print ('噢~这个变量没法删除~')

class Test() :
    x = MyDes(10,'x')

test = Test()
y = test.x
print (y)
test.x = 8
del test.x
print (test.x)

运行结果:
在这里插入图片描述
在这里插入图片描述

import time as t

class Record() :
    def __init__(self,value,duixiang) :
        self.value = value
        self.duixiang = duixiang
        self.filename = "record.txt"

    def filewrite (self,filename,pattern) :
        file1 = open (filename,'a')
        if pattern == 'duqu':
            file1.write("%s 变量于北京时间 %s 被读取,%s = %s\n" %(self.duixiang , t.asctime(),self.duixiang,self.value))
        elif pattern == 'xiugai' :
            file1.write("%s 变量于北京时间 %s 被修改,%s = %s\n" %(self.duixiang , t.asctime(),self.duixiang,self.value))
        elif pattern == 'shanchu' :
            file1.write("%s 变量于北京时间 %s 被删除,%s = %s\n" %(self.duixiang , t.asctime(),self.duixiang,self.value))
    
    def __get__(self,isinstance,owner) :
        Record.filewrite(self,self.filename,'duqu')
        return self.value

    def __set__(self,isinstance,value) :
        self.value = value
        Record.filewrite(self,self.filename,'xiugai')

    def __delete__ (self,isinstance) :
        Record.filewrite(self,self.filename,'shanchu')
        del self.duixiang


class Test() :
    x = Record(10,'x')
    y = Record(8.8,'y')

test = Test()
print (test.x)
print (test.y)
test.x = 123
test.x = 1.23
test.y = "I love Xmy !"

运行结果:
在这里插入图片描述
在这里插入图片描述

import pickle
import os

class MyDes() :
    def __init__(self,duixiang,value = None) :
        self.value = value
        self.duixiang = duixiang 

    def filewrite (self,duixiang,value) :
        file1 = open (duixiang+'.pkl','wb')
        pickle.dump(self.value , file1)
    
    def __get__(self,isinstance,owner) :
        return self.value

    def __set__(self,isinstance,value) :
        self.value = value
        MyDes.filewrite(self,self.duixiang,self.value)

    def __delete__ (self,isinstance) :
        os.remove(self.duixiang+'.pkl')
        del self.duixiang



class Test() :
    x = MyDes('x')
    y = MyDes('y')

test = Test()
test.x = 123
test.y = "I love Xmy !"
print (test.x)
print (test.y)
#del test.x

运行结果:
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_38970783/article/details/88248625