如何在python中检查函数是否存在(但不是继承)?

时间:2012-01-03 06:57:41

标签: python

与此问题有关:

https://stackoverflow.com/questions/8708525/how-to-check-if-mako-function-exist

我想检查一个给定类是否存在一个函数,但是没有继承,所以父类可以调用子函数,否则会导致无限递归..

编辑:

它实际上给出了最大堆栈级别错误,这是相同的。

等效代码为:

class A(object):
    def f(x):
        b = B()
        b.f()

class B(A):
    pass

a = A()
a.f()

我知道这不是干净或首选,但它是模板翻译的内容,我不知道如何检查它。

2 个答案:

答案 0 :(得分:8)

  

我想检查一个给定类是否存在函数,但是不存在继承的

是的,您可以直接查看班级词典。使用 __ dict __ 属性或内置的 vars() 函数::

>>> class A(object):
        def f(x):
            pass

>>> class B(A):
        def g(x):
            pass

>>> 'f' in vars(B)
False
>>> 'g' in vars(B)
True

答案 1 :(得分:2)

如果您需要检查方法是否直接在实例的类中定义而不是在其祖先之一中,那么您可以尝试:

import inspect

def has_method(obj, name):
    v = vars(obj.__class__)
    # check if name is defined in obj's class and that name is a method
    return name in v and inspect.isroutine(v[name])

class A:
    def foo(self):
        print 'foo'

class B(A):
    pass

b = B()
a = A()

print has_method(a, 'foo') # => True
print has_method(b, 'foo') # => False