不幸的是,在定义的时候(这种情况下的类块),除了命名约定之外,代码无法知道如何使用函数。修改你的例子有点:
class ComplextCallableObject(object):
@wrap_me
def __call__(self, a1, a2):
pass #...
@wrap_me
def simple_function(tgt, a1, a2):
pass
ComplextCallableObject.anInstanceMethod = simple_function
ComplextCallableObject.anClassMethod = classmethod(simple_function)
ComplextCallableObject.aStaticMethod = staticmethod(simple_function)
在这种情况下,simple_function
正在实施一项功能采取了目标和两个参数,一个实例方法接受两个参数,一个类的方法接受两个参数,一个静态方法,一个目标和两个参数。但是这些用途在定义函数之后才会被绑定。 staticmethod
和classmethod
都会返回不同的对象类型,所以如果需要的话,您可以区分这些对象。
如果你确实想使用约定,你可以检查该函数的第一个参数名称,看它是否是self
:
def wrap_me(fn):
names = fn.func_code.co_varnames
if names and names[0]=='self':
print 'looks like an instance method'
else: print 'looks like a function'
return fn
'wrap_me'应该完成什么?如果两个函数采用不同的参数,它们是如何执行'wrap_me'-able任务的呢? – 2012-03-12 16:41:53