为什么会发生这种情况?
class IsInstanceScrewer(object):
def __init__(self, value):
self.value = value
def __getattribute__(self, name):
if name in ('value',):
return object.__getattribute__(self, name)
value = object.__getattribute__(self, 'value')
return object.__getattribute__(value, name)
isinstance(IsInstanceScrewer(False), bool) #True
isinstance(IsInstanceScrewer([1, 2, 3]), list) #True
该类绝对不是 bool 的实例,即使它试图包装它。
最佳答案
__getattribute__
返回包装值的 __class__
,而不是它自己的 __class__
:
>>> class IsInstanceScrewer(object):
def __init__(self, value):
self.value = value
def __getattribute__(self, name):
print name
if name in ('value',):
return object.__getattribute__(self, name)
value = object.__getattribute__(self, 'value')
return object.__getattribute__(value, name)
>>> isinstance(IsInstanceScrewer(False), bool)
__class__
True
>>> isinstance(IsInstanceScrewer([1, 2, 3]), list)
__class__
True
这可能是期望的行为,也可能不是,具体取决于您正在做什么。
关于python - 为什么重写 __getattribute__ 来代理值会搞砸 isinstance?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14529190/