2012-01-03 111 views
3

类与此相关的问题:如何检查一个函数是否存在(但不是继承)在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() 

我明白这是不干净或首选,但它确实是模板转换为,我不知道如何以其他方式进行检查。

+0

孩子的功能会自动被调用,所以我没有看到这一点。 – 2012-01-03 07:00:10

+0

无限递归?我不认为这是可能的。你能举个例子说明你的意思吗? – john 2012-01-03 07:07:39

+0

ty,添加示例 – Timmy 2012-01-03 07:12:05

回答

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

,但即使当f是非函数变量时,变量(A)中的f也将变为“真”。应该使用'type'来检查它是否有效。 – 2012-01-03 07:04:11

+1

@ p.kolya你似乎是阅读更成问题比实际提出;-)此外,拟议修正案,限制过于严格,''型(F)==类型(拉姆达:0)''将无法工作对于某些类型的可卡因。 – 2012-01-03 07:11:54

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 
+0

感谢,有用的代码片段。 – Nishant 2013-02-21 13:39:00

相关问题