Python对象(译)
这是一篇我翻译的文章,确实觉得原文写的非常好,简洁清晰
原文链接: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.attr和name[index]这样的形式只是一些语法技巧,实际上它们是方法调用(method calls)。前一个对应的方法是__setattr__ / __getattr__,后一个对应的是__setitem__ / __getitem__(对应哪个取决于它们出现在赋值语句的哪一端)
-----------------------
如果这篇文章对你有意义,请推荐噢
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库