Python 2:类范围

时间:2015-09-11 17:54:04

标签: class python-2.7 oop python-decorators

我写了一个装饰器,它将改为用户提供的目录,执行一个函数,然后返回到原始目录。

现在我试图在一个类中使用这个装饰器并且有一个范围问题。这是一个例子。

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

1 个答案:

答案 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!"。这样您就可以根据需要更改环境,然后将其恢复到以前的状态。