如何区分绑定方法或函数与类?

时间:2015-04-09 14:38:35

标签: python

type(product.get_datasheet)显示:

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

我需要区分product.get_datasheet和(ny)类。 callablecallable的文档字符串而无法提供帮助:

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

我正在编写类似于数据绑定的东西,我需要在模板中调用绑定方法,而如果它是一个类,则不应该调用它。

如何从类中区分函数或绑定方法(而不是类方法!)?

1 个答案:

答案 0 :(得分: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