给定一个具有函数或方法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?
但我希望有另一个更直接的方法。在
python3中没有未绑定的方法,因此您也无法检测到它们。你只有常规函数。最多可以看到它们是否有一个qualified name with a dot,表示它们是嵌套的,并且它们的第一个参数名是
self
:当然,对于那些恰好以
self
作为第一个参数的静态方法和嵌套函数,以及不使用self
作为第一个参数的常规方法(违背惯例),这一点完全失败。在对于静态方法和类方法,您必须查看类字典:
^{pr2}$这是因为
C.__dict__['st']
是实际的staticmethod
实例,在binding to the class之前。在你能用
inspect.isroutine(...)
吗?用你的类运行它C
我得到:将
inspect.isroutine(...)
的结果与inspect.ismethod(...)
的结果结合起来,可以让你推断出你需要知道什么。在编辑:dm03514的回答建议您也可以尝试
^{pr2}$inspect.isfunction()
:尽管正如Hernan所指出的,python3中
inspect.isfunction(...)
的结果发生了变化。在因为检验方法对于Python 2.7中的绑定和未绑定方法都返回True(即,被破坏),我使用的是:
它也适用于用C实现的类的方法,例如int:
^{pr2}$但在这种情况下不是很有用,因为检查.getargspec不适用于用C实现的函数
is_-bound_方法在python3中没有变化,但是在python3中,检验方法正确区分绑定方法和非绑定方法,因此没有必要。在
相关问题 更多 >
编程相关推荐