我试图让我的类显示为一个不同的对象,以规避我正在使用的包中的惰性类型检查。更具体地说,我试图让我的对象显示为另一个对象(在我的例子中是 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。
