2015-04-09 2 views
2

type(product.get_datasheet) показывает:Как отличить связанный метод или функцию от класса?

<bound method product.get_datasheet of <pkg.product object at 0x7fbb6c09c290>> 

мне нужно различать product.get_datasheet от (пу) класса. callable не помогает, так как в строку документации callable «ы:

Note that classes are callable, as are instances with a __call__() method. 

Я что-то вроде привязки данных писать, и мне нужно связанный метод, называемый в шаблоне, в то время как, если это класс не должен быть вызван.

Как я могу отличить функцию или связанный метод (но не метод класса!) От класса?

+0

Вы забыли случай вызываемых экземпляров (экземпляры класса, реализующего '__call__') –

+1

Иначе вы можете взглянуть на модуль' types' ... –

ответ

1

Учитывая общий класс, как:

>>> 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
Смежные вопросы