在Python装饰器中获取类
在这段代码中:
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
- 在
def online_only(func, self)
中,你不能有两个参数,这样会报错(TypeError),所以要把它改成def online_only(func)
。 - 被包装的函数的第一个参数会是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