• 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

      

  • 相关阅读:
    转:SkipList跳表
    git操作
    JAVA小工具打包
    Java数字证书操作
    mysql创建数据库和用户
    解决node-sass安装不了的问题
    vscode + angular
    ng2 quickstart-primeng
    ng2 quickstart
    使用淘宝的npm代理下载模块
  • 原文地址:https://www.cnblogs.com/lyq-biu/p/10287631.html
Copyright © 2020-2023  润新知