2015-10-27 43 views
1

比方說,一個功能着眼於一個對象,並檢查其是否具有功能a_method你如何隱藏hasattr?

def func(obj): 
    if hasattr(obj, 'a_method'): 
     ... 
    else: 
     ... 

我有一個對象,它的類定義a_method,但我想隱藏從hasattr它。我不想改變func的實現來實現這種隱藏,那麼我能做些什麼來解決這個問題?

+2

你可以重新定義'hasattr'。 –

+0

你爲什麼想要這樣做?這是一件非常糟糕的事情。另外,'hasattr'通過試圖訪問它來檢查是否存在'obj.a_method',所以你必須讓'attribute' *僅在'hasattr'沒有看到時才存在*。 – user2357112

回答

3

如果該方法在班級上定義,您似乎可以從該班級的__dict__中刪除該方法。這可以防止查找(hasattr將返回false)。如果你在刪除它的時候仍然可以使用這個函數(比如例子) - 請記住,你必須傳入一個類的實例,它不會被隱含地調用,暗示的是self

>>> class A: 
... def meth(self): 
...  print "In method." 
... 
>>> 
>>> a = A() 
>>> a.meth 
<bound method A.meth of <__main__.A instance at 0x0218AB48>> 
>>> fn = A.__dict__.pop('meth') 
>>> hasattr(a, 'meth') 
False 
>>> a.meth 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: A instance has no attribute 'meth' 
>>> fn() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: meth() takes exactly 1 argument (0 given) 
>>> fn(a) 
In method. 
+0

這幾乎等同於不將該方法放入類中,只爲其定義一個模塊級函數。 – user2357112

+0

@ user2357112 - 但不需要修改類的定義,並且可以在運行時實現。 –

+0

但是,如果您無法更改類定義,則可能無法更改所有依賴該方法的代碼。 – user2357112

1

您可以重新定義hasattr函數。下面是一個例子。

saved_hasattr = hasattr  

def hasattr(obj, method): 
    if method == 'MY_METHOD': 
    return False 
    else: 
    return saved_hasattr(obj, method) 

請注意,您可能想要執行比檢查方法名稱更詳細的檢查。例如檢查對象類型可能是有益的。

0

試試這個:

class Test(object): 

    def __hideme(self): 
     print 'hidden' 


t = Test() 

print hasattr(t,"__hideme") #prints False.... 

我相信這個工程B/C的隱藏成員的雙下劃線魔法類外部世界的(擁有以名字改編)......除非有人有一個有力的論據對此,我認爲這比從__dict__彈出的東西好得多?思考?