鱼C论坛

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

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

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

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

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

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

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

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

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

  11. 2.
  12. 都会

  13. 3.
  14. 20
  15. 0

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


  19. 动动手:
  20. 0.
  21. class MyDes:
  22.     def __init__(self,value = 0,name = '未命名'):
  23.         self.value = value
  24.         self.name = name

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

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

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

  34. class Test:
  35.     x = MyDes(10,'x')

  36. test = Test()

  37. 1.
  38. i         self.name = name

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

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

  57. test = Test()

  58. 2.
  59. import pickle as p
  60. import os

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

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

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

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

  74. class Test:
  75.     x = MyDes('x')
  76.     y = MyDes('y')

  77. test = Test()
复制代码

本帖被以下淘专辑推荐:

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-28 05:00

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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