问题起源:
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
实践证明: