python - 为什么重写 __getattribute__ 来代理值会搞砸 isinstance?

标签 python class inheritance getattribute new-style-class

为什么会发生这种情况?

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/

相关文章:

python - 压缩和应用函数列表和相应参数时出现类型错误

javascript - 如何键入类或构造函数

database - 将接口(interface)而不是类映射到数据库表

class - 多参数构造函数的回调

c++ - 从直接多重继承改为间接多重继承会出现什么问题?

python - 修改 numpy 数组的特定单元格列表

Python 给定日期、时间、小时...我怎样才能得到它的 ISO ZULU 格式

python - 如何根据任意条件函数过滤字典?

Java——继承和多态

c# - XML 序列化和继承类型