Python 的哲学是一切皆对象,这是什么意思呢?就是说 Python 中所有的东西都是对象,比如 int 值,float 值,str 值,bool 值,list 值,tuple 值,dict 值,set 值,None, 当然也包含我们自己定义类的对象。大家可能会说明明 int 值是 int 类型,float 值是 float 类型,str 值是 str 类型,bool 值是 bool 类型,list 值是 list 类型,dict 值是 dict 类型,set 值是 set 类型,None 是 NoneType 类型,自定义对象当然是自定义类的类型了。在此我告诉大家其实 Python 中的内置的这些数据类型本身就是用类实现的,比如 int 是 class int 来实现的,float 是 class float 来实现的等等。
在此我再告诉大家一个秘密:Python 中的内置数据类型和我们自定义的类本身也是个对象(不要惊讶) 甚至函数也是对象(再说一遍不要惊讶)。 我的意思是说:Python 内置的所有类型(int,float, list,tuple,dict,set,NoneType) 和我们自定义的类以及函数都是对象。
我们本节课学习两个函数 isinstance 和 type。
我们用 isinstance 函数可以判断一个东西的本质是什么,下面我们就来验证在 Python 中一切皆对象。
def func(): pass class Test(): pass print(isinstance(1, object)) print(isinstance(1.1, object)) print(isinstance("hello", object)) print(isinstance(False, object)) print(isinstance([1], object)) print(isinstance((1,), object)) print(isinstance({1: 1}, object)) print(isinstance(set([1]), object)) print(isinstance(None, object)) print(isinstance(Test(), object)) print(isinstance(int, object)) print(isinstance(float, object)) print(isinstance(str, object)) print(isinstance(bool, object)) print(isinstance(list, object)) print(isinstance(tuple, object)) print(isinstance(dict, object)) print(isinstance(set, object)) print(isinstance(type(None), object)) print(isinstance(Test, object)) print(isinstance(func, object))
我们知道 isinstance 可以验证一个事物的本质是什么,大家请思考一个有趣的问题:假如我们自定义一个父类 Human 和子类 Woman(Woman类继承 Human 类),我们用 Woman 类定义一个对象 ruhua,我们知道 ruhua 是 Woman 那么请问 ruhua 是不是也是 Human(ruhua 当然也是人了)。所以说子类的对象本质是定义它的类,也是个它所属类的父类。
class Human(object): pass class Woman(Human): pass ruhua = Woman() print(isinstance(ruhua, Woman)) # True,如花是个女人 print(isinstance(ruhua, Human)) # True,如花当然也是人
我们知道 isinstance 函数可以判断一个东西的本质,但是很多时候我们更想知道一个东西具体是属于什么类型, 其实所有的对象(int 值,float 值,str 值,bool 值,list 值,tuple 值,dict 值,set 值,None,我们自己定义类的对象) 都属于直接创建它们的类类型;所有的 python 内置类(int,float, list,tuple,dict,set,NoneType)和自定义类(继承 object) 都属于 type 类型;自定义类(不继承 object)属于 classobj 类型;函数属于 function 类型。 Type 函数可以判断一个东西具体所属的类型,我们通过下面表格来了解。
被判断的东西 | 解释 | 例子 |
---|---|---|
int 值 | int 值属于 int 类型 | type(1) 返回 int |
float 值 | float 值属于 float 类型 | type(1.1) 返回 float |
str 值 | str 值属于 str 类型 | type("hello") 返回 str |
bool 值 | bool 值属于 bool 类型 | type(False) 返回 bool |
list 值 | list 值属于 list 类型 | type([1]) 返回 list |
tuple 值 | tuple 值属于 tuple 类型 | type((1,)) 返回 tuple |
dict 值 | dict 值属于 dict 类型 | type([1]) 返回 dict |
set 值 | set 值属于 set 类型 | type(set([1])) 返回 set |
自定义类的对象 | 对象属于自定义类类型 | type(对象) 返回自定义类名 |
int | int 属于 type 类型 | type(int) 返回 type |
float | float 属于 type 类型 | type(float) 返回 type |
bool | bool 属于 type 类型 | type(bool) 返回 type |
list | list 属于 type 类型 | type(list) 返回 type |
tuple | tuple 属于 type 类型 | type(tuple) 返回 type |
dict | dict 属于 type 类型 | type(dict) 返回 type |
set | set 属于 type 类型 | type(set) 返回 type |
自定义类 | 类属于 type 类型 | type(类) 返回 type |
函数 | 函数 属于 function 类型 | type(函数) 返回 function |
注意:自定义的类继承 object 和不继承 object 的 type 有差别,为了更好的理解上面的表格,大家运行一下下面的代码。
def func(): pass class Test(): pass class Myobject(object): pass print(type(1)) print(type(1.1)) print(type("hello")) print(type(False)) print(type([1])) print(type((1,))) print(type({1: 1})) print(type(set([1]))) print(type(None)) print(type(Myobject())) print(type(int)) print(type(float)) print(type(str)) print(type(bool)) print(type(list)) print(type(tuple)) print(type(dict)) print(type(set)) print(type(type(None))) print(type(Myobject)) print(type(func))
记住子类的对象也是父类的对象
弄明白 isinstance 和 type 函数。
把上面的程序好好练一练。
博主举的例子给力!