Учитывая общий класс, как:
>>> class A:
... def __call__(self): pass
...
И модуль типа:
>>> import types
Вы можете проверить, является ли объект функция (callable
возвращает True
для всех испытанных объекта ниже):
>>> isinstance(A, (types.FunctionType, types.BuiltinFunctionType))
False
>>> isinstance(a, (types.FunctionType, types.BuiltinFunctionType))
False
>>> isinstance(A.__call__, (types.FunctionType, types.BuiltinFunctionType))
True
>>> isinstance(a.__call__, (types.FunctionType, types.BuiltinFunctionType))
False
И вы можете проверить, является ли объект методом:
>>> isinstance(A, (types.MethodType, types.BuiltinMethodType))
False
>>> isinstance(a, (types.MethodType, types.BuiltinMethodType))
False
>>> isinstance(A.__call__, (types.MethodType, types.BuiltinMethodType))
False
>>> isinstance(a.__call__, (types.MethodType, types.BuiltinMethodType))
True
Так что, если вы хотите, чтобы проверить, является ли объект obj
: с
- Функция:
isinstance(obj, (types.FunctionType, types.BuiltinFunctionType))
является True
- Метод:
isinstance(obj, (types.MethodType, types.BuiltinMethodType))
является True
- Функция или метод:
isinstance(obj, (types.FunctionType, types.BuiltinFunctionType, types.MethodType, types.BuiltinMethodType))
является True
- Другой вызываемый объект:
isinstance(obj, (types.FunctionType, types.BuiltinFunctionType, types.MethodType, types.BuiltinMethodType))
является False
- Поэтому
not isinstance(obj, (types.FunctionType, types.BuiltinFunctionType, types.MethodType, types.BuiltinMethodType))
является True
Вы забыли случай вызываемых экземпляров (экземпляры класса, реализующего '__call__') –
Иначе вы можете взглянуть на модуль' types' ... –