type(product.get_datasheet)
显示:
<bound method product.get_datasheet of <pkg.product object at 0x7fbb6c09c290>>
我需要区分product.get_datasheet
和(ny)类。 callable
因callable
的文档字符串而无法提供帮助:
Note that classes are callable, as are instances with a __call__() method.
我正在编写类似于数据绑定的东西,我需要在模板中调用绑定方法,而如果它是一个类,则不应该调用它。
如何从类中区分函数或绑定方法(而不是类方法!)?
答案 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