你如何隐藏hasattr?

时间:2015-10-27 01:11:06

标签: python python-2.7

假设一个函数查看一个对象并检查它是否具有函数a_method

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

我有一个对象,其类定义a_method,但我希望隐藏来自hasattr。我不想改变func的实现来实现这种隐藏,那么我可以做些什么来解决这个问题呢?

3 个答案:

答案 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__弹出的东西更好吗?想法?