擅长:python、mysql、java
<p>你在正确的轨道上。您希望您的类也是<a href="https://docs.python.org/2/reference/datamodel.html#object.__get__" rel="nofollow">descriptor</a>:</p>
<pre><code>import types
class FunctionFaker( object ):
def __init__(self, f):
self.f= f
def empty_function(self):
pass
def __call__(self, *args, **kwargs):
self.empty_function()
self.f(*args, **kwargs)
def __get__(self, instance, cls=None):
# see https://docs.python.org/2/howto/descriptor.html#functions-and-methods
return types.MethodType(self, instance, cls)
@FunctionFaker
def foo(arg1):
print "in foo", arg1
class Bar(object):
@FunctionFaker
def bar(self, arg1):
print "in bar", self, arg1
foo('hello') # in foo hello
Bar().bar('world') # in bar <__main__.Bar object at 0x7fc50b90fb10> world
Bar().bar.empty_function()
</code></pre>
<p>现在,如果您的decorator绑定到一个类,它的行为类似于一个描述符(在decorated函数中将适当的实例绑定到<code>self</code>),如果它没有绑定到一个类,它的行为就像一个普通的装饰器。整洁。在</p>