原本想实现这样的功能
class a:
  logs=[]
  
  @self.log()
  def b():
    print('1')
    
  def log(self,text=''):
    def decorator(func):
      @functools.wraps(func)
      def wrapper(s, *args, **kw):
        self.logs.append(func,args,kw)
        return func(*args, **kw)
      return wrapper
    return decorator
  
  def redo(self):
    for _ in self.logs:
      _[0](*_[1],**_[2])
    
但这是错误的,@self.log()会报错 NameError: name 'self' is not defined 也想过把 log 拉出来,不放在 class a 里,有 2 个思路: 1.log 加一个 object 的参数,每次把这个 class 传进去 2.log()用 class 包裹起来,先初始化把 class a 传进去,后来调用就不用加 object 的参数了。
但是遇到问题 思路 1:@log(self)也是会报错 NameError: name 'self' is not defined 思路 2:没办法所有操作在 class a 内完成,没办法做成包调用
求助 QAQ
|  |      1just1 OP = =在线等!! | 
|  |      2ipconfiger      2017-06-17 23:31:14 +08:00  1 头上无数黑线飘过 | 
|  |      31iuh      2017-06-17 23:35:23 +08:00  1 为什么要这样写装饰器? | 
|  |      4just1 OP | 
|  |      5XYxe      2017-06-17 23:40:22 +08:00 via Android  1 log 定义成静态方法或者类方法,然后 @ a.log | 
|  |      7phithon      2017-06-17 23:42:44 +08:00  1 这样?  ) | 
|  |      9just1 OP | 
|      11SP00F      2017-06-17 23:50:47 +08:00 ``` import functools def log(): def decorator(func): @functools.wraps(func) def wrapper(self, *args, **kwargs): self.logs.append([func, args, kwargs]) return func(self, *args, **kwargs) return wrapper return decorator class a: logs = [] @log() def b(self, log): print(1) c = a() c.b("ccc") print(c.logs) ``` 不知道是不是你需要的结果。。`self.logs.append(func,args,kw)` 这里也是不对的,列表在进行 append 操作的时候只能添加一个。。 | 
|      13tomwei7      2017-06-17 23:51:40 +08:00 首先 python 装饰器是编译时执行的,而且 self 代表当前类的实例在调用类方法的时候作为第一个参数,self 只是一个约定成俗的写法 | 
|      14SP00F      2017-06-17 23:55:54 +08:00 | 
|  |      15billion      2017-06-18 00:02:45 +08:00 | 
|  |      16XYxe      2017-06-18 00:03:57 +08:00 via Android @just1 self 是在创建对象实例之后调用函数的时候才绑定的,所以在外面是不能用 self 的。改成静态函数,然后把 logs 属性按照类属性来用 a.logs.append 就可以。 | 
|  |      19sagaxu      2017-06-18 01:28:48 +08:00 |