一.python中的一切皆是对象
1.编译型语言和解释型语言的区别:
1.1编译型语言:
需通过编译器(compiler)将源代码编译成机器码,之后才能执行的语言。一般需经过编译(compile)、链接(linker)这两个步骤。
优点:编译器一般会有预编译的过程对代码进行优化。因为编译只做一次,运行时不需要编译,所以编译型语言的程序执行效率高。可以脱离语言环境独立运行。
缺点:编译之后如果需要修改就需要整个模块重新编译。编译的时候根据对应的运行环境生成机器码,不同的操作系统之间移植就会有问题,需要根据运行的操作系统环境编译不同的可执行文件。
1.2解释型语言:
解释性语言的程序不需要编译,相比编译型语言省了道工序,解释性语言在运行程序的时候才逐行翻译。
优点:有良好的平台兼容性,在任何环境中都可以运行,前提是安装了解释器(虚拟机)。灵活,修改代码的时候直接修改就可以,可以快速部署,不用停机维护。
缺点:每次运行的时候都要解释一遍,性能上不如编译型语言。
2.python中函数和类也是对象,属于python的一等公民:
2.1.函数和类可以赋值给一个变量:
1 #一切皆对象
2 def fun_test(name="haha"):3 print(name)4 #函数赋给变量是并实列化
5 my_name=fun_test6 print(isinstance(my_name,object))7 my_name("LYQ")
从结果可以看出,函数也是对象
1 classCla_test:2 def __init__(self, name="haha"):3 print(name)4
5
6 cl =Cla_test7 print(isinstance(cl, object))8 cl(name="LYQ")
2.2可以添加到集合对象中:
1 def fun_test(name="haha1"):2 print(name)3 my_name =fun_test4 classCla_test:5 def __init__(self, name="haha2"):6 print(name)7 obj_list=[]8 obj_list.append(fun_test)9 obj_list.append(Cla_test)10 for i inobj_list:11 print(i())
实列化打印,None是函数无返回值。默认返回None,<__main__.cla....>
2.3可以作为参数传给函数:
defprint_type(fun_test):
fun_test()print(type(fun_test))
print_type(fun_test)
2.4可以当作函数的返回值:
#也就是一个很简单的装饰器
defdecorator_test():print("开始")returnfun_test
dec=decorator_test()
dec("hahaha")
二.type,object,class之间的关系
1.type——>int——>1 (type——>class——>obj):
可以很容易看出,class,list,int,str等类都是基于type类的,既是对象(type的对象),也是类,而对象1,'abc',[1,2]等各自基于int,str,list等类。
2.object是最顶层基类:
所有类的最底层基类都是object,如果类不继承其他的,默认继承object。
3.type也是一个类,同时是一个对象:
type把一切变成对象(包括自己【通过指针实现】),一切类最底层基类又都是object【type继承object,object是type的实例】。
三.python中的常见类型
1.对象的三个特征:
1.1身份(对象在内存中的地址,可以通过id这个函数查看):
1.1.1不可变对象:
不可变对象是指对象的内存值不能被改变。Python中变量以引用的方式指向对象,如果变量引用了不可变对象,当改变该变量时,由于其所指的对象的值不能被改变,相当于把原来的值复制一份后再改变,这会开辟一个新的地址,变量再指向这个新的地址,即变量引用了新的对象。
数值类型(整数和浮点)、字符串str、元组tuple都是不可变类型。比如a=1,b=[1],c={'a':1},id(a)、id(b[0])、id(1)、id(c['a'])将输出一样的值,因为1是不可变对象,其在内存中是不可改变的。
1.1.2可变对象:
可变对象是指对象的内存值可以被改变,变量(准确的说是引用)改变后,实际上是其所指的值直接发生改变,并没有发生复制行为,也没有开辟新的内存地址,通俗点说就是原地改变。列表list、字典dict、集合set是可变类型。
1.2类型:
如int,str,list,dict等等
1.3值:
即具体的值。
2.None(全局只有一个):
Python在解释器启动时会用None类型实列化一个None对象。
3.数值:
int,float,complex(复数),bool
4.迭代类型:
可以遍历。
5.序列类型:
list,bytes、bytearray、memoryview(二进制序列),range,tuple,str,array
6.映射(dict):
key-value
7.集合(实现原理和dict差不多,效率高):
set,frozenset(不可修改)
8.上下文管理类型(with)
9.其他:
模块类型(from,import),class和实例,函数类型,方法类型,代码类型(代码本身会被Python解释器变成一个对象类型),object对象,type类型,ellipsis类型(省略号),notimplemented类型(高级设计时)
四.参考文献