• Python一切皆对象


    目录

      1 引言

      2 对象的概念

      3 对象的创建和引用

      4 共享引用

      5 对象相等

      6 对象回收机制  

    1 引言  

      Python从设计之初就是一门面向对象的语言,它有一个重要的概念,即一切皆对象。

        Java虽然也是面向对象编程的语言,但是血统没有Python纯正。比如Java的八种基本数据类型之一int,在持久化的时候,就需要包装成Integer类对象。但是在python中,一切皆对象。数字、字符串、元组、列表、字典、函数、方法、类、模块等等都是对象,包括你的代码。

    2 对象的概念

      究竟何谓对象?不同的编程语言以不同的方式定义“对象”。某些语言中,它意味着所有对象必须有属性和方法;另一些语言中,它意味着所有的对象都可以子类化。

      在Python中,定义是松散的,某些对象既没有属性也没有方法,而且不是所有的对象都可以子类化。但是Python的万物皆对象从感性上可以解释为:Python 中的一切都可以赋值给变量或者作为参数传递给函数。

      Python 的所有对象都有三个特性:

        身份:每个对象都有一个唯一的身份标识自己,任何对象的身份都可以使用内建函数 id() 来得到,可以简单的认为这个值是该对象的内存地址。

        类型:对象的类型决定了对象可以保存什么类型的值,有哪些属性和方法,可以进行哪些操作,遵循怎样的规则。可以使用内建函数 type() 来查看对象的类型。

        值:对象所表示的数据。

       "身份"、"类型"和"值"在所有对象创建时被赋值。如果对象支持更新操作,则它的值是可变的,否则为只读(数字、字符串、元组等均不可变)。只要对象还存在,这三个特性就一直存在。

       对象的属性:大部分 Python 对象有属性、值或方法,使用句点(.)标记法来访问属性。最常见的属性是函数和方法,一些 Python 对象也有数据属性,如:类、模块、文件等。

    3 对象的创建和引用

      

      简单来看,上边的代码执行了以下操作:

    • 创建了一个对象来代表数字 4
    • 如果变量 a 不存在,创建一个新的变量 a
    • 将变量 a 和数字 4 进行连接,即 a 成为对象 4 的一个引用,从内部来看,变量是到对象的内存空间的一个指针,尤其注意:变量总是连接到对象,而不会连接到其他变量。

      从概念上可以这样理解,对象是堆上分配的一个内存空间,用来表示对象所代表的值;变量是一个系统创建的表中的元素,拥有指向对象的引用;引用是从变量到对象的指针。

      从技术上来说,每一个对象有两个标准的头部信息,一个类型标识符来标识类型,还有一个引用的计数器,用于决定是否需要对对象进行回收。这里还涉及到对象的一种优化方法,Python 缓存了某些不变的对象对其进行复用,而不是每次创建新的对象。

      

    4 共享引用

      在 Python 中变量都是指向某一对象的引用,当多个变量都引用了相同的对象,成为共享引用。

      但对于像列表这种可变对象来说则不同。

      由于列表的这种可变性,在代码执行某些操作时可能出现一些意外,因此需要对其进行拷贝来保持原来的列表。

      对于字典和集合等没有分片概念的类型来说,可以使用 copy 模块中的 copy() 方法进行拷贝。

    5 对象相等

       == 操作符用于测试两个被引用的对象的值是否相等。
      is 用于比较两个被引用的对象是否是同一个对象。

     

      当操作对象为一个较小的数字或较短的字符串时,又有不同:

      这是由于 Python 的缓存机制造成的,小的数字和字符串被缓存并复用,所以 a 和 b 指向同一个对象。

    6 对象回收机制

      上边提到对象包含一个引用的计数器,计数器记录了当前指向该对象引用的数目,一旦对象的计数器为 0 ,即不存在对该对象的引用,则这个对象的内存空间会被回收。这就是 Python 中对象的回收机制,一个最明显的好处即在编写代码过程中不需要考虑释放内存空间。

      可以通过 sys 模块中的 getrefcount() 函数查询一个对象计数器的值:

     

    文章转载自:

    Python一切皆对象(https://www.cnblogs.com/wangxin37/p/6598466.html)

  • 相关阅读:
    LOJ.6281.数列分块入门5(分块 区间开方)
    HDU.3571.N-dimensional Sphere(高斯消元 模线性方程组)
    POJ.2891.Strange Way to Express Integers(扩展CRT)
    Codeforces.100633J.Ceizenpok's formula(扩展Lucas)
    Some Formulas.
    洛谷.3807.[模板]卢卡斯定理(Lucas)
    CODEVS.3990.中国余数定理2(CRT)
    BZOJ.3667.Rabin-Miller算法(MillerRabin PollardRho)
    洛谷.1919.[模板]A*B Problem升级版(FFT)
    POJ.2065.SETI(高斯消元 模线性方程组)
  • 原文地址:https://www.cnblogs.com/caihongmin/p/10967300.html
Copyright © 2020-2023  润新知