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