Skip to main content
 首页 » 编程设计

python之__instancecheck__之覆盖显示无效之我做错了什么

2025年05月04日11fff_TT

我试图让我的类显示为一个不同的对象,以规避我正在使用的包中的惰性类型检查。更具体地说,我试图让我的对象显示为另一个对象(在我的例子中是 tuple)的实例,而实际上它甚至不是那个对象的派生。

为了实现这一点,我计划覆盖 __isinstance__ 方法,根据 docs ,应该完全按照我的意愿去做。但是,我似乎不明白该怎么做,因为我的尝试没有成功。

这是一个 SSCCE,它应该使 isinstance 在所有情况下都返回 False,但事实并非如此。

class FalseInstance(type): 
    def __instancecheck__(self, instance): 
        return False 
 
class Foo(metaclass=FalseInstance): 
    pass 
 
g = Foo() 
isinstance(g, Foo) 
> True 

我做错了什么?

请您参考如下方法:

除了 __metaclass__ 的问题和精确类型匹配的快速路径之外,__instancecheck__ 的工作方向与您尝试做的相反。类的 __instancecheck__ 检查其他对象是否被视为该类的虚拟实例,而不是该类的实例是否被视为其他类的虚拟实例。

如果你想让你的对象在 isinstance 检查中对它们的类​​型撒谎(你真的不应该),那么做到这一点的方法就是对 __class__ 撒谎,未实现 __instancecheck__。

class BadIdea(object): 
    @property 
    def __class__(self): 
        return tuple 
 
print(isinstance(BadIdea(), tuple)) # prints True 

顺便说一句,如果你想获得对象的实际类型,请使用 type 而不是检查 __class__ 或 isinstance。