比方說,一個功能着眼於一個對象,並檢查其是否具有功能a_method
:你如何隱藏hasattr?
def func(obj):
if hasattr(obj, 'a_method'):
...
else:
...
我有一個對象,它的類定義a_method
,但我想隱藏從hasattr
它。我不想改變func
的實現來實現這種隱藏,那麼我能做些什麼來解決這個問題?
比方說,一個功能着眼於一個對象,並檢查其是否具有功能a_method
:你如何隱藏hasattr?
def func(obj):
if hasattr(obj, 'a_method'):
...
else:
...
我有一個對象,它的類定義a_method
,但我想隱藏從hasattr
它。我不想改變func
的實現來實現這種隱藏,那麼我能做些什麼來解決這個問題?
如果該方法在班級上定義,您似乎可以從該班級的__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.
這幾乎等同於不將該方法放入類中,只爲其定義一個模塊級函數。 – user2357112
@ user2357112 - 但不需要修改類的定義,並且可以在運行時實現。 –
但是,如果您無法更改類定義,則可能無法更改所有依賴該方法的代碼。 – user2357112
您可以重新定義hasattr函數。下面是一個例子。
saved_hasattr = hasattr
def hasattr(obj, method):
if method == 'MY_METHOD':
return False
else:
return saved_hasattr(obj, method)
請注意,您可能想要執行比檢查方法名稱更詳細的檢查。例如檢查對象類型可能是有益的。
試試這個:
class Test(object):
def __hideme(self):
print 'hidden'
t = Test()
print hasattr(t,"__hideme") #prints False....
我相信這個工程B/C的隱藏成員的雙下劃線魔法類外部世界的(擁有以名字改編)......除非有人有一個有力的論據對此,我認爲這比從__dict__
彈出的東西好得多?思考?
你可以重新定義'hasattr'。 –
你爲什麼想要這樣做?這是一件非常糟糕的事情。另外,'hasattr'通過試圖訪問它來檢查是否存在'obj.a_method',所以你必須讓'attribute' *僅在'hasattr'沒有看到時才存在*。 – user2357112