如何确定python对象是函数还是类方法?

如何确定python对象是函数还是类方法?,python,Python,让我们举一个例子: class Foo: def func(self): pass def func(): pass f1 = Foo.func f2 = func 我正在检查代码,想从dir或inspect中找出f1是否是类方法,而f2是否是不属于任何类的函数?内置的检查模块有ismember和isfunction方法 然而,除非您正在做一些相当深奥的事情,否则对于用户代码来说应该无关紧要 编辑:如果您正在做一些深奥的事情,请注意,在原始问题中,您询问的是类

让我们举一个例子:

class Foo:
   def func(self):
        pass

def func():
   pass

f1 = Foo.func
f2 = func


我正在检查代码,想从
dir
inspect
中找出
f1
是否是类方法,而
f2
是否是不属于任何类的函数?

内置的检查模块有ismember和isfunction方法

然而,除非您正在做一些相当深奥的事情,否则对于用户代码来说应该无关紧要

编辑:如果您正在做一些深奥的事情,请注意,在原始问题中,您询问的是类
Foo
上的属性,而不是
Foo
的实例上的属性。这就不同了:

In [1]: def f(): return None

In [2]: class F:
   ...:     def f(self):
   ...:         return None
   ...: 

In [3]: import inspect

In [4]: [inspect.isfunction(_) for _ in [f, F.f, F().f]]
Out[4]: [True, True, False]

In [5]: [inspect.ismethod(_) for _ in [f, F.f, F().f]]
Out[5]: [False, False, True]

此时,我发现的唯一东西是
obj.\uuuu qualname\uuuu
-如果它包含一个点-这意味着它是类的一个方法


但我不能100%确定这是完美的解决方案

只需打印函数名:

print('f1 =',f1)
print('f2 =',f2)
输出为:

f1 = <function Foo.func at 0x7f56105f3620>
f2 = <function func at 0x7f5611ce7e18>
f1=
f2=

这将给出完整的函数名,包括父类名称(如果它是一个类方法,如
Foo.func

),目的是什么?这有什么关系?您是否尝试查看
inspect
(通过
dir
)中定义的名称以查看是否有任何相关内容?可能是名称中有
功能
方法
的东西?您是否尝试过在这些事情上使用
help
Foo.fn2.\uu qualname\uu=
ismethod
为实例方法(
Foo().func
)返回True,但不为在类级别定义的函数返回True,这些函数在调用时是一些实例方法(
Foo.func
)。在这种情况下是行不通的。由于
类型(Foo().func
)是
,而
类型(Foo.func)
,因此无需使用
insect
来区分它们。只需检查点,嵌套函数就会出现误报,哪些有
\uuuu qualname\uuuu
看起来像。@user2357112supportsMonica您能举个例子说明什么时候会发生这种情况吗?我在前面的评论中链接了一个例子。您所指的似乎是一个报告,看起来像是从qualname那里得到的。我很抱歉。我想不出有什么相似之处