Python 你如何躲避hasattr?
假设一个函数查看一个对象并检查它是否有一个函数Python 你如何躲避hasattr?,python,python-2.7,Python,Python 2.7,假设一个函数查看一个对象并检查它是否有一个函数a_方法: def func(obj): if hasattr(obj, 'a_method'): ... else: ... 我有一个对象,其类定义了a_方法,但我想对hasattr隐藏它。我不想改变func的实现来实现这种隐藏,那么我能做些什么来解决这个问题呢?如果该方法是在类上定义的,那么您似乎可以将其从类的\uuuuuu dict\uuuu中删除。这可以防止查找(hasattr将返回false
a_方法
:
def func(obj):
if hasattr(obj, 'a_method'):
...
else:
...
我有一个对象,其类定义了
a_方法
,但我想对hasattr
隐藏它。我不想改变func
的实现来实现这种隐藏,那么我能做些什么来解决这个问题呢?如果该方法是在类上定义的,那么您似乎可以将其从类的\uuuuuu dict\uuuu
中删除。这可以防止查找(hasattr将返回false)。如果在删除该函数时保留对它的引用,则仍然可以使用该函数(如示例所示)-请记住,必须为self传递类的实例,而不是使用隐含self调用它
>>A类:
... def冰毒(自身):
... 打印“在方法中”
...
>>>
>>>a=a()
>>>甲基苯丙胺
>>>fn=A.。_dict__.pop('meth'))
>>>hasattr(一种“冰毒”)
错误的
>>>甲基苯丙胺
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
AttributeError:实例没有属性“meth”
>>>fn()
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
TypeError:meth()正好接受1个参数(给定0)
>>>fn(a)
在方法上。
如果在类上定义了该方法,则可以将其从该类的\uuuuu dict\uuuuu
中删除。这可以防止查找(hasattr将返回false)。如果在删除该函数时保留对它的引用,则仍然可以使用该函数(如示例所示)-请记住,必须为self传递类的实例,而不是使用隐含self调用它
>>A类:
... def冰毒(自身):
... 打印“在方法中”
...
>>>
>>>a=a()
>>>甲基苯丙胺
>>>fn=A.。_dict__.pop('meth'))
>>>hasattr(一种“冰毒”)
错误的
>>>甲基苯丙胺
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
AttributeError:实例没有属性“meth”
>>>fn()
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
TypeError:meth()正好接受1个参数(给定0)
>>>fn(a)
在方法上。
您可以重新定义hasattr函数。下面是一个例子
saved_hasattr = hasattr
def hasattr(obj, method):
if method == 'MY_METHOD':
return False
else:
return saved_hasattr(obj, method)
请注意,您可能希望实现更详细的检查,而不仅仅是检查方法名称。例如,检查对象类型可能是有益的。您可以重新定义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,它将一个类的成员(由于名称被破坏)隐藏到外部世界……除非有人对此有强烈的反对意见,否则我认为这比从\uuuu dict\uuuu
中弹出内容要好得多?想法?试试这个:
class Test(object):
def __hideme(self):
print 'hidden'
t = Test()
print hasattr(t,"__hideme") #prints False....
我相信这是双下划线魔法的b/c,它将一个类的成员(由于名称被破坏)隐藏到外部世界……除非有人对此有强烈的反对意见,否则我认为这比从
\uuuu dict\uuuu
中弹出内容要好得多?想法?您可以重新定义hasattr。为什么要这样做?这真是一件令人讨厌的事。另外,hasattr
只需尝试访问它即可检查obj.a_方法
是否存在,因此您必须使该属性仅在hasattr
未查看时存在。您可以重新定义hasattr
。为什么要这样做?这真是一件令人讨厌的事。另外,hasattr
只需尝试访问它即可检查obj.a\u方法是否存在,因此,您必须使该属性仅在hasattr
未查看时存在。这相当于根本不将该方法放入类中,而只是为其定义一个模块级函数。@user2357112-但无需修改类的定义,并且在运行时实现。但是,如果您无法更改类定义,您可能无法更改依赖于该方法的所有代码。这相当于根本不将该方法放在类中,而只是为其定义一个模块级函数。@user2357112-但无需修改类的定义,并且可以在运行时实现。但是如果您不在若要更改类定义,您可能无法更改依赖于该方法的所有代码。