鱼C论坛

 找回密码
 立即注册
查看: 1142|回复: 0

[技术交流] 第 46 讲 魔法方法 描述符(Property的原理)

[复制链接]
发表于 2018-4-22 12:12:26 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
课堂笔记:
  1. 文件打开用with open(path) as f 不用f.close(),方便

测试题:
0.
描述符是一个至少有__get__(self,instance,owner),__set__(self,instance,value),__delete__(self,instance)其一的类,并把这个类的实例对象赋予其他类的属性,被赋予属性的类就被描述符描述了.

一个程序有一个需求,在变量被查找赋值或删除时执行,就用描述符来完成.

1.
get:__get__(self,instance,owner),
set:__set__(self,instance,value),
del:__delete__(self,instance)

2.
都会

3.
20
0

4.
9 
返回实例层次的描述符,会返回描述符本身,必须调用类层次的描述符,否则无法调用set,get等方法.


动动手:
0.
 class MyDes:
    def __init__(self,value = 0,name = '未命名'):
        self.value = value
        self.name = name

    def __get__(self,instance,owner):
        print('正在获取变量:',self.name)
        return self.value

    def __set__(self,instance,value):
        print('正在修改变量:',self.name)
        self.value = value

    def __delete__(self,instance):
        print('正在删除变量:',self.name)
        print('噢,这个变量没法删除~')

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

test = Test()

1.
i         self.name = name

    def __get__(self,instance,owner):
        print('%s 变量于北京时间 %s 被读取,%s = ' % (self.name,t.asctime(),self.name),self.value)
        get_record = '%s 变量于北京时间 %s 被读取,%s = ' % (self.name,t.asctime(),self.name) + str(self.value) + '\n'
        f = open('/Users/yufan/Documents/python编程/46/46dds1_record.txt','a',encoding = 'GBK')
        f.write(get_record)
        f.close()
        return self.value

    def __set__(self,instance,value):
        self.value = value
        print('%s 变量于北京时间 %s 被修改,%s = ' % (self.name,t.asctime(),self.name),self.value)
        set_record = '%s 变量于北京时间 %s 被修改,%s = ' % (self.name,t.asctime(),self.name) + str(self.value) + '\n'
        f = open('/Users/yufan/Documents/python编程/46/46dds1_record.txt','a',encoding = 'GBK')
        f.write(set_record)
        f.close()
        
class Test:
    x = Record(10,'x')
    y = Record(8.8,'y')

test = Test()

2.
import pickle as p
import os

class MyDes:
    def __init__(self,name = '未命名',value = 0):
        self.name = name
        self.value = value

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

    def __set__(self,instance,value):
        self.value = value
        set_file = open('/Users/yufan/Documents/python编程/46/46dds2/%s.pkl' % self.name,'wb')
        p.dump(self.value,set_file)
        set_file.close()

    def __delete__(self,instance):
        os.remove('/Users/yufan/Documents/python编程/46/46dds2/%s.pkl' % self.name)

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

test = Test()

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-23 02:55

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表