在Python装饰器中获取类

4 投票
2 回答
3009 浏览
提问于 2025-04-15 19:33

在这段代码中:

def online_only(func, self):
    def f(*args, **kwargs):
        if self.running:
            return func(*args, **kwargs)
        else:
            return False
    return f

class VM(object):
   @property
   def running(self):
       return True

   @property
   @online_only
   def diskinfo(self):
       return True

我希望只有当 VM.running 返回 True 时,diskinfo 才能运行。我该怎么做才能让 online_only 能够读取 self.running 呢?

2 个回答

1
  1. def online_only(func, self)中,你不能有两个参数,这样会报错(TypeError),所以要把它改成def online_only(func)
  2. 被包装的函数的第一个参数会是self,你可以直接使用这个参数,例如:

def online_only(func):
    def f(self):
        if self.running:
            return func(self)
        else:
            return False
    return f

class VM(object):
    @property
    def running(self):
        return True

    @property
    @online_only
    def diskinfo(self):
        return True

print VM().diskinfo
7

self 是作为包装函数的第一个参数传入的,所以在 f 中要特别对待这个第一个参数:

def online_only(func):
    def f(self, *args, **kwargs):
        if self.running:
            return func(self, *args, **kwargs)
        else:
            return False
    return f

撰写回答