怎么判断一个函数是对象的方法?

>>> f = open("test.ss", "r")
>>> type(f.read)
<class 'builtin_function_or_method'>

type函数能得到某个变量的类型,怎么确定一个变量是某个对象的方法呢?注意,是确定是对象的方法而不是全局函数,这是有区别的!

我写出了如下程序片段,但是结果都不对。

import types

if type(x) == types.BuiltinFunctionType or type(x) == types.BuiltinMethodType :

正确的写法是什么?

阅读 2.8k
3 个回答

对于Python代码定义的类和函数,可以通过types.MethodType和types.FunctionType判断。而且只能分辨出对象实例的绑定方法。

import types

# function
isinstance(A.f, types.FunctionType)  # True

# method
isinstance(A().f, types.MethodType)  # True

但是对builtin类型的对象不能判断是方法还是函数。

这里说的builtin是指用C/C++编写的二进制模块,对于二进制模块提供的函数来说没有方法和函数的区别。这个是 Python C-API 决定的。

在标准库里提供的 types.BuiltinMethodTypetypes.BuiltinFunctionType 是一样的。

types.BuiltinMethodType is types.BuiltinFunctionType  # True
class A:

    def f(self, n):
        return n

a = A()
ff = a.f
print(hasattr(a, ff.__name__))

可以判断函数方法名称是否在dir(class) 中

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏