原本想实现这样的功能
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
1
just1 OP = =在线等!!
|
2
ipconfiger 2017-06-17 23:31:14 +08:00 1
头上无数黑线飘过
|
3
1iuh 2017-06-17 23:35:23 +08:00 1
为什么要这样写装饰器?
|
4
just1 OP |
5
XYxe 2017-06-17 23:40:22 +08:00 via Android 1
log 定义成静态方法或者类方法,然后 @ a.log
|
7
phithon 2017-06-17 23:42:44 +08:00 1
这样?
![image]( ) |
9
just1 OP |
11
SP00F 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 操作的时候只能添加一个。。 |
13
tomwei7 2017-06-17 23:51:40 +08:00
首先 python 装饰器是编译时执行的,而且 self 代表当前类的实例在调用类方法的时候作为第一个参数,self 只是一个约定成俗的写法
|
14
SP00F 2017-06-17 23:55:54 +08:00
|
15
billion 2017-06-18 00:02:45 +08:00
|
16
XYxe 2017-06-18 00:03:57 +08:00 via Android
@just1 self 是在创建对象实例之后调用函数的时候才绑定的,所以在外面是不能用 self 的。改成静态函数,然后把 logs 属性按照类属性来用 a.logs.append 就可以。
|
19
sagaxu 2017-06-18 01:28:48 +08:00
|