这是一篇我翻译的文章,确实觉得原文写的非常好,简洁清晰

原文链接:http://effbot.org/zone/python-objects.htm

--------------------------------------

简介

先清空你的大脑,丢掉以前的概念

对象(objects)

所有的Python对象都有如下特性:

  • 一个独一无二的id(a unique id),这是一个整数,id(x)的返回值
  • 一个类型(a type),type(x)的返回值
  • 一些内容(some content)

你不能改变对象的id

你也不能改变对象的type

一些对象允许你改变他们的内容(不改变对象的id和type)

一些对象不允许其内容被修改

类型(type)是由一个类型对象(type object)来表示的,类型对象知道关于这种类型的对象的一些信息(比如占用多少字节内存,这个类型的对象有些什么方法(method))

(注意:在CPython2.2的后续版本,可以在很特定的情况下修改对象的type)

关于对象更多(more about objects)

对象也可以有这些特性:

  • 0个或多个方法(method),由类型对象(type object)提供
  • 0个或多个名字(name)

一些对象拥有方法让你可以直接修改对象的内容(即通过对象自己就修改对象的内容)

一些对象拥有的方法,让你只可以去读取它的内容而不能修改

还有些对象没有任何方法

尽管对象可以有方法,但你也永远不能改变对象的type和id

对象的属性赋值(attribute assignment)和元素引用(item reference)只是语法上的小技巧(实际上都是调用对象的方法)

[笔者注:Python用object.__getitem__(self, key)和object.__setitem__(self, key)来实现object[key](元素引用);用object.__setattr__(self, name)来实现object.attr = value(属性赋值)]

对象名字(names)

名字比较特别,实际上名字并不能算作对象的特性,而且一个对象也不知道它自己叫什么名字

一个对象可以有多个名字,也可以没有名字

名字存在于命名空间中(namespace),比如模块命名空间(module namespace),实例命名空间(instance namespace),以及一个函数的局部命名空间(a funciton's local namespace)。

命名空间是名字和对象引用对的集合(collection of name, object reference pairs),用字典实现。[笔者注:参见随笔Python基础-作用域和命名空间

当一个函数或方法被调用时,会创建一个命名空间,并且用调用时的实参进行初始化(名字是从函数定义的形参列表获取的,对象则是传进去的实参)。

赋值(Assignment)

赋值语句修改的是命名空间,而不是对象

换句话说:

name = 10

意味着你把名字"name"加入到了当前的命名空间,并且让它指向了一个整型对象(integer object),这个对象的值(value)是10

如果名字在当前命名空间中已经存在,则赋值操作会取代原有的名字。

name = 10

name = 20

第一步操作表示首先你将名字"name"加入到当前命名空间中,让后让它指向一个整型对象,对象的值为10;然后你用第二个"name"替代了第一个"name",让它指向一个值为20的整型对象;原来的对象"10"并不受这步操作任何影响,而且它也不关心。

与之对应的,如果你这样做:

name = []

name.append(1)

首先你把名字"name"加到了当前的命名空间,让它指向了一个空的list对象,这步操作修改了命名空间;然后你调用了这个对象的一个方法,告诉这个list对象尾部添加一个integer对象。第二步操作修改了list对象的内容,但是并没有涉及到命名空间,也没有涉及到原来的integer对象。

name.attrname[index]这样的形式只是一些语法技巧,实际上它们是方法调用(method calls)。前一个对应的方法是__setattr__ / __getattr__,后一个对应的是__setitem__ / __getitem__(对应哪个取决于它们出现在赋值语句的哪一端)

-----------------------

如果这篇文章对你有意义,请推荐噢

Python对象(译)的更多相关文章

  1. python征程3.0(python对象)

    1.python使用对象模型来存储数据.构造任何类型的值都是一个对象.”尽管python被当成一种面向对象的脚本的编程语言“,但你完全能够写出不使用任何类和实例的脚本. python对象都拥有三个特性 ...

  2. python 对象

    python 对象 在python中,对象就是为C中的结构体在堆上申请的一块内存,一般来说,对象是不能被静态初始化的,并且不能再栈空间上生存.本文主要对Python的基本数据类型做简单的介绍. PyO ...

  3. Python 对象的引用计数和拷贝

    Python 对象的引用计数和拷贝 Python是一种面向对象的语言,包括变量.函数.类.模块等等一切皆对象. 在python中,每个对象有以下三个属性: 1.id,每个对象都有一个唯一的身份标识自己 ...

  4. 《Python核心编程》 第四章 Python对象- 课后习题

    练习 4-1. Python对象.与所有Python对象有关的三个属性是什么?请简单的描述一下. 答:身份.类型和值: 身份:每一个对象都有一个唯一的身份标识自己,可以用id()得到.  类型:对象的 ...

  5. Python对象体系揭秘

    Guido用C语言创造了Python,在Python的世界中一切皆为对象. 一.C视角中的Python对象 让我们一起追溯到源头,Python由C语言实现,且向外提供了C的API http://doc ...

  6. 【2】python核心编程 第四章-python对象

    1.python对象 所有的Python 对像都拥有三个特性:身份,类型和值. 身份: 每一个对象都有一个唯一的身份标识自己,任何对象的身份可以使用内建函数id()来得到. 这个值可以被认为是该对象的 ...

  7. python学习笔记:python对象

    一.python对象 python使用对象模型来存储数据,构造任何类型的值都是一个对象.所有的python对象都拥有三个特性:身份.类型和值. 身份:每个对象都有一个唯一的身份标识自己,对象的身份可以 ...

  8. Python对象类型及其运算

    Python对象类型及其运算 基本要点: 程序中储存的所有数据都是对象(可变对象:值可以修改 不可变对象:值不可修改) 每个对象都有一个身份.一个类型.一个值 例: >>> a1 = ...

  9. 判断python对象是否可调用的三种方式及其区别

    查找资料,基本上判断python对象是否为可调用的函数,有三种方法 使用内置的callable函数 callable(func) 用于检查对象是否可调用,返回True也可能调用失败,但是返回False ...

随机推荐

  1. SQL group by分组查询(转)

    本文导读:在实际SQL应用中,经常需要进行分组聚合,即将查询对象按一定条件分组,然后对每一个组进行聚合分析.创建分组是通过GROUP BY子句实现的.与WHERE子句不同,GROUP BY子句用于归纳 ...

  2. bzoj3668: [Noi2014]起床困难综合症

    从高位到低位枚举期望的应该是ans最高位尽量取一.如果该数最高位为o的话能够取得1直接更新ans否则判断该位取1是否会爆m不会的话就加上. #include<cstdio> #includ ...

  3. 【第八篇】mvc razor视图配置404 500页面

    记住是最外层的这个Web.config 在  <system.web> </system.web>节点里面配置 <customErrors defaultRedirect ...

  4. [转]C#中的?和??

    原文链接:http://msdn.microsoft.com/zh-tw/library/2cf62fcy%28VS.80%29.aspx 使用可為 Null 的型別 (C# 程式設計手冊) Visu ...

  5. BZOJ 1977 次小生成树

    TM终于过了.... #include<iostream> #include<cstdio> #include<cstring> #include<algor ...

  6. swun 1766 我的悲剧不可能那么好数

    解题思路: 一向提交特别慎重的我,这题竟然PE了5发左右,放了几天,再回来写,直接1A, 相当的自豪,而且是最优解题者.这题千万要注意,化繁为简,文章只包括大小   写字母和数字,还有空行. #inc ...

  7. Mac设置截图保存位置

    补充: killall 用来杀死指定名字的进程 defaults 可以对一些系统属性进行read,write,delete操作 下面举几个常用的例子: 1.显示隐藏文件 defaults write ...

  8. table 锁定表头,出滚动对齐

    前一段时间来了一个汇总的需求,想锁定表头,这个问题在网上找了老半天,实现起来都比较麻烦,经过这几天的摸索终于找到一个简洁的处理方法 下面介绍一下如何处理的: 1.thead 和tbody 放两个tab ...

  9. Senparc.Weixin.MP SDK 微信公众平台开发教程(二):成为开发者

    Senparc.Weixin.MP SDK 微信公众平台开发教程(二):成为开发者 这一篇主要讲作为一名使用公众平台接口的开发者,你需要知道的一些东西.其中也涉及到一些微信官方的规定或比较掩蔽的注意点 ...

  10. Datawindow.net+access数据窗口制作方法

    1) 数据字典:采用SQLServer桌面程序来创建数据字典.配置正确的pbl文件生成输入列表. 在SQLServers查询器中执行select * from pbcatedt where pbe_n ...