Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 你如何躲避hasattr?_Python_Python 2.7 - Fatal编程技术网

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-但无需修改类的定义,并且可以在运行时实现。但是如果您不在若要更改类定义,您可能无法更改依赖于该方法的所有代码。