2012-01-03 112 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

相關問題