Python一切皆对象

一.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_test
6 print(isinstance(my_name,object))
7 my_name("LYQ") 

从结果可以看出,函数也是对象

1 class Cla_test:
2     def __init__(self, name="haha"):
3         print(name)
4 
5 
6 cl = Cla_test
7 print(isinstance(cl, object))
8 cl(name="LYQ")

    2.2可以添加到集合对象中:

 1 def fun_test(name="haha1"):
 2     print(name)
 3 my_name = fun_test
 4 class Cla_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 in obj_list:
11     print(i())

实列化打印,None是函数无返回值。默认返回None,<__main__.Cla....是类中实列化后__init__()返回一个类的对象

    2.3可以作为参数传给函数:

def print_type(fun_test):
    fun_test()
    print(type(fun_test))


print_type(fun_test)

    2.4可以当作函数的返回值:

#也就是一个很简单的装饰器
def decorator_test():
    print("开始")
    return fun_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类型(高级设计时)

四.参考文献

  1.动态语言和静态语言的区别:https://blog.csdn.net/lvxiangan/article/details/78391281

  2.Python对象内存地址:https://blog.csdn.net/fragmentalice/article/details/81363494

  

原文地址:https://www.cnblogs.com/lyq-biu/p/10287631.html