擅长:python、mysql、java
<p>当<code>decobar</code>应用于“registry”时,可以将其添加到“registry”,然后检查注册表以确定<code>decobar</code>是否应用于该函数。这种方法需要保持原始函数的<code>__module__</code>和{<cd4>}属性的完整性(在包装函数上使用<code>functools.wraps</code>)。在</p>
<pre><code>import functools
class decobar(object):
registry = set()
@classmethod
def _func_key(cls, f):
return '.'.join((f.__module__, f.func_name))
@classmethod
def present(cls, f):
return cls._func_key(f) in cls.registry
def __call__(self, f):
self.registry.add(self._func_key(f))
@functools.wraps(f)
def wrap():
return f() + "bar"
return wrap
# Make the decorator singleton
decobar = decobar()
def decofu(f):
@functools.wraps(f)
def wrap():
print decobar.present(f) # Tells me whether decobar was also applied
return f() + "fu"
return wrap
@decofu
@decobar
def important_task():
return "abc"
</code></pre>
<p>使用一个类来实现<code>decobar</code>,因为它将<code>registry</code>和{<cd8>}保存在一个名称空间中(IMO,这感觉更干净了)</p>