問題起源:
class t():pass
s1 = t()
s2 = type("Student2",(),{})
isinstance(s1, type), isinstance(s2, type)
為什么第一個是false,第二個是true呢
根因定位:
在Python中,一切皆對象,類是對象,實例也是對象。但它們是不同類型的對象。
- s1 = t() 這一行代碼創建了類t的一個實例,賦值給變量s1。這里,s1是t的一個實例對象,而不是一個類。
- s2 = type(“Student2”, (), {}) 這一行代碼動態創建了一個新類,類名為"Student2",沒有父類(()中為空),類體中沒有任何屬性或方法({}為空字典)。type在這里被用作動態創建類的函數,這個函數返回一個新的類對象。因此,s2是一個類,而不是某個類的實例。
當調用isinstance(object, classinfo)函數時,它會檢查object是否是classinfo的實例或者是classinfo的子類的實例。在給定上述情況:
- isinstance(s1, type) 會返回False,因為s1是t類的一個實例,而不是一個類。在Python中,type是所有新式類的元類,但s1不是一個類,它是類t的實例。
- isinstance(s2, type) 會返回True,因為s2是使用type函數動態創建的一個類對象。在Python中,所有的類本質上都是type的實例。就像是類是對象的模板一樣,type是類的模板。因此,s2是type的一個實例。
結論:
簡而言之,第一個表達式是False因為s1是一個類的實例,而不是類本身;第二個表達式是True,因為s2本身是一個由type創建的類。
isinstance本質是判斷第一個參數是不是第二個參數的實例
type的對象類,類的對象是實例,type—>class—>instance
可以推斷:
isinstance(s1.class, type)為true
實踐證明: