[闲聊] Python isinstance

楼主: heterologic (仿生边缘人会梦见VTber吗)   2023-04-27 01:09:47
我来出一题:
def check(x):
return isinstance(x, x)
有没有可能让 check() 回传 True?
如果有的话,有几种方法?
乍看之下,x 得要是自己的 instance
所以就算有的话也不多见
以下是我想的到的几种方法,不过可能有其他方法也说不定
1. x = type
最正统的方法,因为 type 的型别就是 type
所以当然会通过
2. isinstance = lambda x, y: True
偷偷把 isinstance 改掉
有点像作弊,不过总之是能回传 True
3. x = (tuple,)
实际上,isinstance 的第二个参数还可以是 tuple 或 types.UnionType
只要 tuple 中的其中一个 type 符合就会回传 True
例如 isinstance(1, (int, str)) 和 isinstance('a', (int, str)) 都会回传 True
因此,
1) x = (tuple,) 的型别是 tuple,所以可以通过
2) x = types.UnionType | None 的型别是 types.UnionType
4. metaclass
isinstance 实际上会去呼叫第二个参数的 metaclass 里的 __instancecheck__()
所以可以写一个自己的 metaclass 来控制 isinstance 结果:
class Meta(type):
def __instancecheck__(mcls, _):
return True
class MyType(metaclass=Meta):
pass
print(isinstance(MyType, MyType)) # True
会发现这件事是因为我发现 isinstance(1, numbers.Number) 会回传 True
但 int 完全没有继承到 numbers.Number
才发现应该是用 metaclass 做到的
还有其他回传 True 的方法吗 :)

Links booklink

Contact Us: admin [ a t ] ucptt.com