我写了一个装饰器,它将改为用户提供的目录,执行一个函数,然后返回到原始目录。
现在我试图在一个类中使用这个装饰器并且有一个范围问题。这是一个例子。
class SampleClass(object):
def __init__(self, working_dir):
self.dir = working_dir
@preserve_cwd(self.dir)
def do_stuff(self):
pass
Python将返回 NameError:name' self'未定义。
有没有一种很好的方法在类的__init__方法中定义属性并且能够在类名空间中使用它们?谢谢你的帮助。
编辑:
评论要求装饰者定义。
def preserve_cwd(working_dir):
"""Decorator: Return to the current working directory after function call.
:param str working_dir: path to working directory
"""
def decorator(func):
@functools.wraps(func)
def wrapped(*args, **kwargs):
original_dir = os.getcwd()
os.chdir(working_dir)
try:
func(*args, **kwargs)
finally:
os.chdir(original_dir)
return wrapped
return decorator
答案 0 :(得分:0)
装饰者在方法之外,而不在内部,这就是为什么没有定义自我。
您可以尝试这样的代码:
#define the decorator, it accepts the function to be wrapped
def dec(f):
#it returns a function that takes some arguments
def wrapper(*args):
s, = args #take the first one (it should be self)
print(s.dir) #do something
result = f(*args) #call the wrapped function
print(s.dir) #do something
return result #return the result of the function
#and returns the wrapped function
return wrapper
class A:
def __init__(self, dir):
self.dir = dir
@dec
def p(self):
print "P!"
a = A("ABC")
a.p()
你应该得到" ABC"印刷在上面和下面" P!"。这样您就可以根据需要更改环境,然后将其恢复到以前的状态。