在python3中检测类(不是实例)中的绑定方法

2024-09-28 22:21:53 发布

您现在位置:Python中文网/ 问答频道 /正文

给定一个具有函数或方法f的类C,我使用inspect.ismethod(obj.f)(其中{}是{}的一个实例)来确定{}是否是绑定方法。有没有一种方法可以直接在类级别执行相同的操作(不创建对象)?在

在检验方法不起作用:

class C(object):

    @staticmethod
    def st(x):
        pass

    def me(self):
        pass

obj = C()

结果如下(在Python 3中):

^{pr2}$

我想我需要检查函数/方法是否是类的成员,而不是静态的,但是我不能很容易地做到这一点。我想可以使用classify_class_attrs来完成,如下所示 How would you determine where each property and method of a Python class is defined? 但我希望有另一个更直接的方法。在


Tags: 实例方法函数objobjectdefpass级别
3条回答

python3中没有未绑定的方法,因此您也无法检测到它们。你只有常规函数。最多可以看到它们是否有一个qualified name with a dot,表示它们是嵌套的,并且它们的第一个参数名是self

if '.' in method.__qualname__ and inspect.getargspec(method).args[0] == 'self':
    # regular method. *Probably*

当然,对于那些恰好以self作为第一个参数的静态方法和嵌套函数,以及不使用self作为第一个参数的常规方法(违背惯例),这一点完全失败。在

对于静态方法和类方法,您必须查看类字典

^{pr2}$

这是因为C.__dict__['st']是实际的staticmethod实例,在binding to the class之前。在

你能用inspect.isroutine(...)吗?用你的类运行它C我得到:

>>> inspect.isroutine(C.st)
True
>>> inspect.isroutine(C.me)
True
>>> inspect.isroutine(obj.st)
True
>>> inspect.isroutine(obj.me)
True

inspect.isroutine(...)的结果与inspect.ismethod(...)的结果结合起来,可以让你推断出你需要知道什么。在

编辑:dm03514的回答建议您也可以尝试inspect.isfunction()

^{pr2}$

尽管正如Hernan所指出的,python3中inspect.isfunction(...)的结果发生了变化。在

因为检验方法对于Python 2.7中的绑定和未绑定方法都返回True(即,被破坏),我使用的是:

def is_bound_method(obj):
    return hasattr(obj, '__self__') and obj.__self__ is not None

它也适用于用C实现的类的方法,例如int:

^{pr2}$

但在这种情况下不是很有用,因为检查.getargspec不适用于用C实现的函数

is_-bound_方法在python3中没有变化,但是在python3中,检验方法正确区分绑定方法和非绑定方法,因此没有必要。在

相关问题 更多 >