我正在编写一个装饰器,出于各种烦人的原因[0],检查它所包装的函数是独立定义还是作为类的一部分定义(以及新类是子类化的类)是方便的.
例如:
def my_decorator(f):
defined_in_class = ??
print "%r: %s" %(f, defined_in_class)
@my_decorator
def foo(): pass
class Bar(object):
@my_decorator
def bar(self): pass
应该打印:
<function foo …>: False
<function bar …>: True
另外,请注意:
- 在应用装饰器时,该函数仍然是一个函数,而不是一个未绑定的方法,因此测试实例/未绑定的方法(使用
typeof
orinspect
)将不起作用。 - 请只提供解决这个问题的建议——我知道有很多类似的方法可以实现这个目的(例如,使用类装饰器),但我希望它们在装饰时发生,而不是稍后。
[0]:具体来说,我正在编写一个装饰器,可以很容易地使用nose
. 但是,nose
不会在 的子类上运行测试生成器unittest.TestCase
,所以我希望我的装饰器能够确定它是否在 的子类中使用TestCase
并失败并出现适当的错误。显而易见的解决方案 -isinstance(self, TestCase)
在调用包装函数之前使用不起作用,因为包装函数需要是一个生成器,它根本不会被执行。