【发布时间】:2019-02-09 15:29:20
【问题描述】:
我试图让我的类显示为不同的对象,以规避我正在使用的包中的惰性类型检查。更具体地说,我试图让我的对象显示为另一个对象的实例(在我的情况下为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
我做错了什么?
【问题讨论】:
-
你的非元组类是什么样的?它是否实现了您的包所需的所有元组方法?对于您的问题,我能想到的唯一真正的解决方案是子类元组,但要覆盖它的所有方法。
-
@Dunes 谢谢,我调整了问题。我现在也明白为什么我提供的代码不起作用了。但是,如果我现在翻转示例并将其更改为
__isinstance__始终返回 True,它仍然无法按我预期的方式工作:isinstance(g, int)仍然返回False.这里有什么问题? -
@Dunes 对于第二个问题 -
tuples是不可变的,因此使用起来有点麻烦,对吧?我还不知道包的工作需要元组的哪些方面,但我想我会在抛出异常时添加它们......
标签: python python-3.x metaclass magic-methods isinstance