鱼C论坛

 找回密码
 立即注册
查看: 2083|回复: 1

python的一个描述符与装饰器组合运用问题

[复制链接]
发表于 2018-10-15 22:50:47 | 显示全部楼层 |阅读模式

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

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

x
问题由来是“零基础入门学Python”课程中第46课练习第二题的使用描述符跟踪并保存类属性变动情况:1. 按要求编写描述符 MyDes:记录指定变量的读取和写入操作,并将记录以及触发时间保存到文件:record.txt。我用内嵌函数方式弄妥了,后又想试试装饰器方式,一试之下才发现装饰器的内容竟如此博大精深而自己竟是一窍也没通。。。折腾4、5天了也没搞定。
      现在问题是传入被装饰函数进初始化时,发现“func”居然包函了两个位置参数,到“__get__”函数执行完后,直接取"func(r)"发现此时的"func"仅是一个位置参数,不包括被装饰函数的地址了,不能传回调动被装饰函数。__call__函数也不知该在哪写。现将代码附上,恳请各位前辈指教。

  1. class Record:
  2. def __init__(self,func,*args):
  3.         self.m = args
  4.         self.value = func
  5.         self.func = func
  6.             
  7.     def __get__(self,instance,owner):
  8.         import time as t
  9.         m = '正在获取变量:%s →'%self.m
  10.         r = t.asctime(t.localtime())+m+str(self.value)
  11.         print(r)
  12.         return r
  13.    
  14.          
  15.     def __set__(self,instance,value):
  16.         import time as t
  17.         m = '正在修改变量:%s →'%self.m
  18.         self.value = value
  19.         print(m,self.value)
  20.         r = t.asctime(t.localtime())+m+str(self.value)
  21.         print(r)
  22.                

  23. @Record
  24. def saving(r):
  25.     print('Saving...')
  26.     with open('D:/record.txt','a+') as f:
  27.         f.write(r)   
  28.     print('日志已保存!')
  29.    

  30. class Test:
  31.     x = Record(10,'x')
  32.     y = Record(8.8,'y')  

  33.    

  34. test = Test()
  35. test.x
  36. test.x = 13
  37. test.x
  38. test.y
  39. test.y='I love FishC!'
复制代码


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

使用道具 举报

发表于 2018-10-18 23:12:56 | 显示全部楼层
呼叫@冬雪雪冬 大佬~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-20 03:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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