【问题标题】:Check if a function is defined within a Python class检查函数是否在 Python 类中定义
【发布时间】:2021-05-24 20:50:16
【问题描述】:

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

class A:

    def fun1(self):
        pass

def fun2():
    pass

我想区分A.fun1 是在一个类中定义的,而fun2 不是。

【问题讨论】:

  • 你是在问magic(A.fun1) 应该返回Truemagic(fun2) 应该返回False,对吧?
  • 这样做有什么意义?你想解决什么问题?
  • inspect.ismethodinspect.isfunctionismethod 应该在对象上调用。执行这些操作:print(inspect.ismethod(A().fun1), inspect.isfunction(A().fun1)); print(inspect.ismethod(fun2), inspect.isfunction(fun2)).
  • @deceze 完全正确
  • @Arty 正如你所指出的,方法需要实例化类,这在某些情况下可能是不可能的、容易的或有副作用。

标签: python function class methods inspect


【解决方案1】:

给你hasattr()

>>> hasattr(A, 'fun1')
>>> True

>>> hasattr(A, 'fun2')
>>> False

【讨论】:

  • OP要检查是类方法还是函数,而不是类有方法
  • 我的回答怎么不能解决这个问题?
  • 方法不起作用,您的方法也适用于普通属性
  • 方法是在类中定义的函数。确定类是否具有特定功能完全等于“区分该功能是在类中定义的” - 正如 OP 所要求的那样。
  • 在不知道 OP 意味着什么的情况下回答问题并没有真正的成效,可以使用 cmets 来澄清
【解决方案2】:

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

>>> 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'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-20
    • 2012-08-19
    相关资源
    最近更新 更多