【发布时间】:2014-11-24 15:28:51
【问题描述】:
当我尝试在装饰中使用参数装饰方法时,它会给我一个 self 未定义。相反,如果我将 assign val 更改为类变量并使用 MyCls.val 它现在给我 MyCls 未定义!如何装饰我的方法?
def dodecorate(VAL):
def decorate(func):
def wrapped(*args,**kwargs):
res = func(*args,**kwargs)
if res == VAL:
res = "one"
return res
return wrapped
return decorate
class MyCls(object):
def __init__(self):
self.val = 1
@dodecorate(VAL = self.val)
def onefrom1(self, x):
return x
编辑 上面是我发明的一个抽象来表示原件。这是实际的代码。
def retry_on_invalid_schema(MAX_RETRIES):
def retrier(func):
def wrapped(*args, **kwargs):
tries = 0
res = None
while tries < MAX_TRIES:
try:
res = func(*args, **kwargs)
assert res.has_key('by')
assert res.has_key('id')
break
except AssertionError:
res = None
time.sleep(2**tries)
tries += 1
continue
return res
return wrapped
return retrier
class Base(object):
def __init__(self):
self.MAX_RETRIES = 3
@retry_on_invalid_schema(MAX_RETRIES = self.MAX_RETRIES)
def _get_api_response(self, uri):
return json.loads(self._get(uri))
def _get(self, uri):
return requests.get(uri).text
【问题讨论】:
-
你能出示你的
instances吗? -
@Yax 我在有机会实例化它之前就收到了错误。
-
在类定义期间调用装饰器函数时,
self和MyCls都不存在。在这里,您真正想要实现什么?