[閒聊] 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