Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何检查python中是否存在(但未继承)函数?_Python - Fatal编程技术网

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

如何检查python中是否存在(但未继承)函数?,python,Python,与这个问题有点相关: 我想检查给定类是否存在函数,但没有继承,以便父类可以调用子类的函数,否则将导致无限递归 编辑: 它实际上给出了一个最大堆栈级错误,这是相同的 等效代码为: class A(object): def f(x): b = B() b.f() class B(A): pass a = A() a.f() 我知道这不是干净的或首选的,但它是模板翻译成的,我不知道如何检查它否则 我想检查给定类是否存在函数,但不是继承的 是的,你

与这个问题有点相关:

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

编辑:

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

等效代码为:

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

class B(A):
    pass

a = A()
a.f()
我知道这不是干净的或首选的,但它是模板翻译成的,我不知道如何检查它否则

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

是的,你可以直接查字典。使用_dict____)属性或内置函数:

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

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

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

如果需要检查该方法是否直接在实例的类中定义,而不是在其祖先中定义,则可以尝试以下操作:

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

子函数将自动被调用,所以我看不出这有什么意义。无限递归?我认为那是不可能的。你能举例说明你的意思吗?增加一个例子并不能使这个问题变得更好。你真正想做的是什么?但是vars(A)中的
f将是
True
即使
f
是非函数变量。你应该使用
类型
检查它是否起作用。@p.kolya你似乎比实际提出的问题读得更多;-)另外,您提议的修改过于严格,
type(f)==type(lambda:0)
对某些类型的可调用项不起作用。