假设一个函数查看一个对象并检查它是否具有函数a_method
:
def func(obj):
if hasattr(obj, 'a_method'):
...
else:
...
我有一个对象,其类定义a_method
,但我希望隐藏来自hasattr
。我不想改变func
的实现来实现这种隐藏,那么我可以做些什么来解决这个问题呢?
答案 0 :(得分:3)
如果在类上定义了该方法,则您似乎可以从该类的__dict__
中删除该方法。这可以防止查找(hasattr将返回false)。如果在删除它时保留对它的引用,你仍然可以使用该函数(如示例) - 只要记住你必须为自己传递一个类的实例,它不会被暗示调用自
>>> 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.
答案 1 :(得分:1)
您可以重新定义hasattr函数。以下是一个例子。
<div class="body">
<div class="div1"><a href="#" class="block bckgnd1"><span>See more comments</span></div></a><div class="div2 bckgnd2">2 of 18</div>
</div>
请注意,您可能希望实现更详细的检查,而不仅仅是检查方法名称。例如,检查对象类型可能是有益的。
答案 2 :(得分:0)
试试这个:
class Test(object):
def __hideme(self):
print 'hidden'
t = Test()
print hasattr(t,"__hideme") #prints False....
我相信这对于将一个类隐藏成员(拥有名称修改)的双重下划线魔法用于外部世界的b / c ...除非有人对此有强烈反对,我认为这是比从__dict__
弹出的东西更好吗?想法?