К сожалению, во время определения (в данном случае это блок классов), код не может сказать, как будет использоваться функция, за исключением соглашения об именовании. Немного изменив свой пример:
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