检查函数是否在Python类中定义

检查函数是否在Python类中定义,python,function,class,methods,inspect,Python,Function,Class,Methods,Inspect,在Python 3.7+中,检查函数是否在Python类中定义的正确方法是什么。例如: class A: def fun1(self): pass def fun2(): pass 我想区分A.fun1是在类中定义的,而fun2不是 您可以使用属性(在中定义)并检查它是否包含指示此对象是在嵌套范围中定义的。请注意,这也适用于在其他函数中定义的函数,因此它可能会给您带来这种意义上的误报 >>> def test(): ... ... >

在Python 3.7+中,检查函数是否在Python类中定义的正确方法是什么。例如:

class A:

    def fun1(self):
        pass

def fun2():
    pass
我想区分
A.fun1
是在类中定义的,而
fun2
不是

您可以使用属性(在中定义)并检查它是否包含指示此对象是在嵌套范围中定义的
。请注意,这也适用于在其他函数中定义的函数,因此它可能会给您带来这种意义上的误报

>>> def test(): ...
... 
>>> test.__qualname__
'test'
>>> class Foo:
...     def test(self): ...
... 
>>> Foo.test.__qualname__
'Foo.test'
>>> def f():
...     def g(): ...
...     return g
... 
>>> f().__qualname__
'f.<locals>.g'
>def test():。。。
... 
>>>测试名称__
“测试”
>>>Foo类:
...     def测试(自身):。。。
... 
>>>Foo.test.\uuuuu qualname__
“Foo.test”
>>>def():
...     def g():。。。
...     返回g
... 
>>>f()__
“f..g”

OP想检查它是一个类方法还是一个函数,而不是该类是否有一个方法,我的答案如何不能解决这个问题?方法不是函数,你的方法也适用于普通属性方法是在类中定义的函数。确定类是否具有特定的函数与OP要求的“区分该函数是在类中定义的”完全相同。在不知道OP的意思的情况下回答问题并不是真正有效的,可以使用注释来澄清您所问的
magic(a.fun1)
应返回
True
magic(fun2)
应该返回
False
,对吗?这样做有什么意义?你想解决什么问题?有和<应该对对象调用code>ismethod。执行以下操作:
print(inspect.ismethod(A().fun1),inspect.isfunction(A().fun1));打印(inspect.ismethod(fun2)、inspect.isfunction(fun2))
@decezeExactly@Arty正如您所指出的,is方法需要实例化类,这在某些情况下可能不可能、也不容易或有副作用。
>>> def test(): ...
... 
>>> test.__qualname__
'test'
>>> class Foo:
...     def test(self): ...
... 
>>> Foo.test.__qualname__
'Foo.test'
>>> def f():
...     def g(): ...
...     return g
... 
>>> f().__qualname__
'f.<locals>.g'