1

Python:一切皆对象

 3 years ago
source link: https://blogread.cn/it/article/8318?f=hot1
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

   很多Python书籍和Python教程都会提到Python中一切皆对对象,但是这些教程往往不会深入解释这句话到底什么意思,这篇文章主要讨论下Python中一切皆对象这句话的深层含义。

Python中一切皆对象

   Dive into Python这本书给了这句话一个很好的解释:

   不同的编程语言使用不同的方式定义对象。在某些编程语言中,它意味着所有的对象都必须有方法和属性。在另外一些编程语言中,它意味着所有对象必须可子类化(subclassable)。在Python中,这个定义更松散,它并不需要所有的对象都有属性和方法,也不需要所有的对象都可以子类化。但是,在Python中一切皆对象意味着一切皆是对象,它可以被分配给一个变量,亦可以做为函数参数。

   Python中,一切皆是对象,String是对象,Lists是对象,Functions是对象,甚至于Modules都是对象。

   在Python中,所有对象都有如下特点:

  • 一个唯一的ID (ID是一个整型数字,通过id(x)获得)

  • 一个类型 (通过 type(x)获得)

   对象的ID不能修改。

   对象的类型不能修改。

   有些对象允许修改其内容(ID和类型永远不能被修改),这类对象称为可变对象(Mutable)。有些对象不允许修改其内容,这类对象称为不可变对象(Immutable)。

   对象类型被一个类型对象(type object)所表示,该类型对象掌握更多该类型对象的信息,如对象占用了多少内存,对象拥有哪些方法。

   在CPython 2.2 或者更新的版本中,在某些限制不严格的环境中,可以修改对象的类型。

   在Python中,对象还可能有如下特点:

  • 0个或多个方法

  • 0个或多个名称

   有些对象提供一些允许修改其内容的方法。有些对象仅提供一些允许访问其内容,但不允许修改的方法。有些对象则没有任何方法。

   平时所用到的属性赋值和项引用,仅仅是一种语法糖

命名(names)

   命名是指我们通常所说的变量名。

   这里的命名有一点不同-名称并不是对象的属性,对象本身并不知道自己叫什么名称。

   一个对象可以有许多个命名,也可以没有任何命名。

   名称存在于命名空间中,如模块命名空间、实例命名空间、函数本地命名空间等。

   命名空间是键值对(使用字典实现)的集合。

   当我们调用一个函数时,函数的命名空间随着调用函数时传递的参数被初始化。

   赋值操作改变的是命名空间,并没有修改对象。

   如下示例:

name = 10

   上述代码意味着将name这个名称添加到本地的命名空间中,同时将这个名称指向一个值为10的整型对象。

   如果某个名称之前已经存在,赋值操作将替换原来的名称指向。 示例如下:

name = 10
name = 20

   上述代码表示,首先将name这个名称添加到本地命名空间中,并将它指向一个值为10的整型对象中。然后,第二次赋值操作,替换了name这个名称的内容,将它指向一个值为20的整型对象中。最初的值为10的整型对象并未被该操作影响。

   相反的,如果执行以下操作:

name = []
name.append(1)

   上述代码中,首先将name这个名称添加到了本地命名空间中,并将它指向一个值列表对象中,这个操作修改了命名空间。然后,调用了该对象的一个方法,向自身添加一个整型对象,这个操作修改对象本身的内容,但是它并没有影响到命名空间,也没有影响到添加到自身的整型对象。

   上述代码中,name.attrname[index]这些可能的操作仅仅是语法糖。如,name.attr对应__setattr__/__getattr__方法,name[index]对应__setitem__/__getitem__方法。

觉得文章有用?立即:

和朋友一起 共学习 共进步!

建议继续学习:

QQ技术交流群:445447336,欢迎加入!
扫一扫订阅我的微信号:IT技术博客大学习

Recommend

  • 75
    • www.bugcode.cn 6 years ago
    • Cache

    Python两个对象相等的原理

    捕蛇者说 知其然更要知其所以然

  • 136
    • zhuanlan.zhihu.com 6 years ago
    • Cache

    Python:range 对象并不是迭代器

    Python:range 对象并不是迭代器简评:迭代器(iterator)是惰性可迭代对象(lazy iterable),range 函数在 Python 3 中是一个惰性的可迭代对象,那么 range 是不是迭代器呢?为什么。TLNR:Python 3 中的 rang...

  • 35
    • zhuanlan.zhihu.com 5 years ago
    • Cache

    Python 对象内省

  • 34

    这么久以来,我终于确认了一件事,那就是不管是人也好,还是猫也好,常常会忘了想自己当下的身份位置,以及曾经的身份位置。 这个现象在我身上,表现出了双倍分量的严重。这种时刻,我就会想起阿尔法猫,以及她识破我身份的那个...

  • 33
    • 微信 mp.weixin.qq.com 5 years ago
    • Cache

    Python进阶:自定义对象实现切片功能

  • 17

    Python中的对象分为可变与不可变,有必要了解一下,这会影响到python对象的赋值与拷贝。而拷贝也有深浅之别。 不可变对象 简单说就是某个对象存放在内存中,这块内存中的值是不能改变的,变量指向这块内存,如果要改变...

  • 17
    • www.cnblogs.com 4 years ago
    • Cache

    Python第七章-面向对象高级

    面向对象高级 一、 特性 特性是指的 property . property 这个词的翻译一直都有问题, 很多人把它翻译为属性, 其实是不恰当和不准确的. 在这里翻译成特性是为了和属性区别开...

  • 18
    • developer.51cto.com 3 years ago
    • Cache

    Python中有趣的Ellipsis对象

    什么是Ellipsis 在 Python 中你可能有时候会看到一个奇怪的用法,就像是这样: >>> ...   Ellipsis 

  • 6
    • www.biaodianfu.com 3 years ago
    • Cache

    Python对象持久化存储工具pickle

    器→工具, 数据, 术→技巧,

  • 5

    0x01 背景看着标题是不是很诧异? struct不是值类型么? 怎么是 object?先看看一段代码, 输出的结果是是什么?using System; namespace StructDemo { class Program { static void Main(string[] args) {...

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK