关于实例和对象的疑惑
友友们,这是一个很困惑的困惑在学Python之前,老师说Python中一切皆对象,可我到现在也不知道对象是什么。
在学Python的这几个月里,我看到了太多什么实例化,什么对象,并对此产生了极大的疑惑。以下是我看到的例子:
1. 使用decimal.Decimal来实例化一个对象。
2. decimal.Decimal('0.1')是decimal类的Decimal对象实例。
3. 懂了类和对象就会懂实例化对象叫什么。
4. numerator 和 denominator 参数是 numbers.Rational 的实例,并且返回一个值为 numerator / denominator 的 Fraction 实例。
我的问题有以下几点:
0. 什么是对象,什么叫一切皆对象
1. 什么叫实例化一个对象
2. 为什么说decimal.Decimal('0.1')是decimal类的Decimal对象实例:首先什么是对象实例,其次为什么称decimal为类,最后为什么Decimal对象实例是这一类里的。
3. 什么叫类和对象
4. 为什么参数会叫实例,实例是什么,和对象实例有区别吗?
5. 某某某的实例究竟意味着什么呢?
其实我也是有百度过的,但是每次点进去的时候就会跳转页面到CSND,一排信息眼花缭乱,而且他的解释我也不能理解。
如果有友友愿意解释的话,在下不胜感激。
谢谢大噶! 小甲鱼的书对象章节的代码敲完了吗? 本帖最后由 阿奇_o 于 2021-12-22 00:22 编辑
Every object has an identity, a type and a value .
(每个对象 都有一个 唯一id,类型,值)
An object's identitynever changesonce it has been created;
(一个对象的id 一旦被创建,就不会改变 )
you may think of it as the object's address in memory.
(你可以认为 对象的identity 就是对象的内存地址。)
The ‘is’ operator compares the identity of two objects;
( is 操作符 对比两个对象id是否为同一个。注:identity 本身有 "同一性"的意思)
the id() function returns an integer representing its identity.
( id()函数返回的是 代表该对象identity 的一串整数)
可以 先读两三遍,这个官方的"Python语言参考"说明。
然后呢,先稍微区分一下 这四个概念:名 name,唯一标识符 id,类型 type, 值 value
好,下面 请你自己:针对 不同的数据类型(整数int,字符串str,列表list ...,包括None)、
函数,自定义类与类的实例,等等任何你能想到的,进行 如下类似的操作,最后你就会发现规律
对于 列表、字典 或集合 等这些"可变的"数据类型,
不管是否包含元素,创建时都会"绑定"(指向)到不同的对象上(内存)。
>>> obj =
>>> id(obj)
2111689797064
>>> obj =
>>> id(obj)
2111689721736
>>> obj1, obj2 = [], []
>>> print(id(obj1), id(obj2))
2111682878984 2111689723144
>>> obj1, obj2 = [], []
>>> obj1 is obj2
False
>>> d1, d2 = dict(), dict()
>>> d1 is d2
False
>>> s1, s2 = set(), set()
>>> s1 is s2
False
>>>
对于 元组对象 这种"不可变的"数据类型,
……
对于 "类" 与 "类的实例",也是属于"引用类型的对象",
>>> id(str) # 内置的str类,"类"也是对象
140735893776816
>>> class Dog:
pass
>>> id(Dog)
2111685351992
>>> d = Dog()
>>> id(d)
2111689490184
>>> d = Dog()
>>> id(d)
2111689556680
>>> d1, d2 = Dog(), Dog()
>>> d1 is d2
False
……
对于 None 呢? —— None,也是一个对象。
>>> id(None)
140736127272976
>>> id(None)
140736127272976
大概就这样,你自个慢慢试,慢慢玩吧。
ps:不要太在意 "名字",很多时候都是"不同的叫法"而已,或"翻译的锅",或甚至"一时口误",
它们只是形式符号上的不同 而已,其指代的 "实体"(本质·对象)可能是同一个东西。
ps2: Python有哪些对象?(嗯,大的13种,小的13+11种 见"Python语言参考")
阿奇_o 发表于 2021-12-22 00:20
可以 先读两三遍,这个官方的"Python语言参考"说明。
然后呢,先稍微区分一下 这四个概念:名 name, ...
自定义+继承 对象通常就是指变量。从面向对象OO的概念来讲,对象是类的一个实例。在python里很简单,对象就是变量。
a = '1', 1, [], {}, ()通常定义a变量然后赋值,不管是字符串,或者数字,列表,字典,元组,它们都是一个对象,
a = List() 这个我们通常叫 a 是 List的实例对象,也是问题答案,实例化一个对象。
{:10_285:}
suchocolate 发表于 2021-12-21 22:40
小甲鱼的书对象章节的代码敲完了吗?
啊,我没买书,那个要买吗?我怕和教材书一样晦涩难懂。 阿奇_o 发表于 2021-12-22 00:20
可以 先读两三遍,这个官方的"Python语言参考"说明。
然后呢,先稍微区分一下 这四个概念:名 name, ...
好的,我会努力看的!谢谢您。 阿漾 发表于 2021-12-22 16:32
啊,我没买书,那个要买吗?我怕和教材书一样晦涩难懂。
你觉得小甲鱼的视频教程晦涩难懂吗? suchocolate 发表于 2021-12-24 21:26
你觉得小甲鱼的视频教程晦涩难懂吗?
有道理~ 阿漾 发表于 2021-12-27 15:58
有道理~
去买书啦 阿奇_o 发表于 2021-12-22 00:20
可以 先读两三遍,这个官方的"Python语言参考"说明。
然后呢,先稍微区分一下 这四个概念:名 name, ...
您好,我现在看到了您说的——区分四个概念:名 name, 唯一标识符 id, 类型 type, 值 value。
我有以下5个疑惑:
1. 我在其他地方看到:id其实就是对象在内存中的地址,请问这个内存是电脑的内存吗?
2. 我还看到关于id的一种描述:两个不同对象在不同的生命周期中,可能会拥有相同的值。这意味着,关闭了这个IDLE,这个生命周期就结束了,这个对象在内存中就被抹去了。所以在另外一个IDLE中,一个不同的对象,可能会具有上个IDLE中某个对象的id。那出现这个现象的原因就是这两个对象被保存到了相同的位置吗?
3. 请问一个对象会有多种type吗?
4. 请问Python一共有多少种type呀?这个百度出来是只有各种数据类型,那像decimal.Decimal('0.1')属于哪种数据类型呀?
5. 我认识到用type(),id()可以返回对应的类型和id;此外,一个对象的value就是直接输入它然后返回的结果,请问这个认识正确吗?
非常感谢您愿意花时间给我答疑解惑。
本帖最后由 阿奇_o 于 2021-12-28 17:07 编辑
1. 关键还是区分这四个概念:名 name, 唯一标识符 id, 类型 type, 值 value。以及它们的关系。
可以认为 id就是内存地址(都是唯一的);甚至从内存的视角来看,对象的本质(本体)就是:某个内存地址上存储的0和1。
但高级语言是不直接操作内存的,而是抽象的"内存对象"的"名"——即 用可见的、符号化的名,去操作 不可见的内存对象。 直接操作内存的指令,可以认为是"低级语言"(机器语言与汇编语言)。
如 obj = a = 100 obj,a 是可见的名,100是可见化的对象的值value(但 不可见的 是它的类型type是整型,以及id是xxx。另外若是"强类型语言"如Java,你还要亲自指定用哪种类型type,如 int a = 100)。
(类比一下:一张100元的人民币,就是一个对象,它的面值100即对象的value,"人民币"为它所属的类type,不同于"美元"、"欧元"等其他类;这张人民币上的防伪编号,就是它的 id ;你可以给它起个名字叫"小红"、"小花",也可以不用起名字,直接使用它)
当要使用对象时,你就通过obj或a这个名,或直接使用对象,这是另一种情况。 比如,特殊的: 符号名 和 对象的值 相同的情况,id(100) 可以认为这里的 名 是 '100',值也为 100。
另外借助函数也可以直接处理对象。如你后面提到的type(decimal.Decimal('0.1')) 。
理解的关键是:名与对象之间是一种"绑定"、一种"指向" 的关系。(如 obj → a → 值为100的整型对象)
当你用del命令时,就是解除这种绑定关系,如 del a #这样 a 这个符号名,就会从namespace"命名空间"里删除掉,你就"找不到了",就会报错NameError。但 obj 依然绑定和指向那个"值为100的整型对象" ,还可以使用。
>>> obj = a = 100
>>> obj is a
True
>>> id(obj)
140723819415712
>>> id(a)
140723819415712
>>> del a
>>> a
Traceback (most recent call last):
File "<pyshell#5>", line 1, in <module>
a
NameError: name 'a' is not defined
>>> obj
100
>>> id(100)
140723819415712
>>>
(注:绑定关系的建立,除了最常见的赋值语句,还包括 import语句,def 和 class 等声明语句,或直接往namespace里增加新的 key-value)
2. 生命周期,涉及Python的垃圾回收机制。简单来说,当你启动Python(IDLE,IPython等任意启动Python内核的程序),它就会创建一个Python语言环境,
这个环境里初始化后就会有一些默认的"环境变量",而 你 自定义的各种变量、函数或类等,就会保存在namespace里。使用是也是从namespace里找。(更多了解,见globals(), locals() ,作用域等问题,自行了解)
即使 使用的两个IDLE,两个对象 不会保存到相同的位置,因为内存地址是唯一的。但 不同的名字 可以绑定、指向 同一个对象。是否指向同一对象,可以用 is 判断,如 >>> obj is a
不同的时间点,两个对象可能存在于相同的内存地址上(内存是"随机存储"的)。
这就好比 自习教室的占座位。张三和李四,不可能同时坐在相同的座位;但在不同时间点上可以,若张三不坐了,李四就可以占用。
若把特定的某个座位,看做是一个对象,张三、李四 则是绑定和指向了 同一个对象。
(再类比和区分一下:座位上有几本书,可以看做是 对象的值value;座位的type 属于"座位类",不同于老师的"讲台类";教室地址编号+座位号,则是对象的id ;张三或李四这样的名字,则是使用这些座位对象的名字name。)
3. 一个对象,不会有多种type —— 但可以通过"继承"、"组合"、自动转换类型 等方式,以能够使用其他类的"属性"Attributes。
如 "继承"的情况,其实任何一个类都默认继承了object 这个"总父类",所以 在你自定义一个类 时,即使什么都不写,如 class Dog: pass
然后,创建一个该类的实例对象,并绑定到d这个名字上,如 d=Dog() ;
然后,dir(d)或直接 dir(Dog()) #会看到一堆默认的方法,其实可以看做是继承了object类里的方法。
如果你在自定义类里 定义了这些"特殊方法",def __str__(self): ...,那就属于"重写"override 这一概念范畴了。
关于这些特殊方法可以参考:Python官方语言参考之"数据模型"的"特殊方法"部分。并自己找问题和例子来练习。
注1:广义上,类的"属性"Attributes,包括 实例变量和实例方法,类变量,甚至"类方法"、"静态方法";
狭义上,属性 只是指 "变量"(类变量或实例变量),方法是"方法"或"函数"。 不同语言,或有不同的叫法。
注2:
又特殊地,在Python中,类本身也是对象,也继承了object,所以 dir(Dog) 也是返回默认的那些特殊方法。
但一个是叫做 Dog的"类"。(或叫"类对象",个人叫法。或更精准地说,是基于"元类/type类"的 叫做 Dog的类。。)
一个基于该Dog类的"实例对象",你可以叫它 d,也可以不给它起名字。
所以 type(Dog) 和 type(Dog()) 是不同的;type(Dog())和type(d)是相同的。
而 id(Dog()) 和 id(d) 又是不同的,因为它们虽然都是基于Dog类而创建的实例对象,但分别指向两个不同的对象(至少id不同)。
4. 具体有多少种type,不重要,重要的是 会区分,以及熟悉常用的类型。要知道有哪些类型,去看 Python官方语言参考之"数据模型"的 "标准类型层级结构"。
如果要知道 具体是哪一种类型,请用 type(obj) 如 >>>type(decimal.Decimal('0.1')) #返回<class 'decimal.Decimal'>
这应该是归为 Python标准库中的"自定义类"。这和你自定义 class Dog: 这样的类,是一样的。
5. 见我在另一个问题的回答, 在交互模式下与非交互模式下的 __repr__与__str__ 的区别。
https://fishc.com.cn/forum.php?mod=viewthread&tid=207343&page=1&extra=#pid5683921
其实很简单,我能两三句话让你明白,但是学习主要学习学习过程,且这也会让知识一文不值,古人装逼 和现代人装逼 给一些定义加些难以捉摸的模糊概念就是让你学会思考 甚至学会质疑.放轻松慢慢来~实在不行可以mark下,先学其他的 一周后回来再看 可能发现只是自己基础知识认知不够呢
好哒,谢谢您
页:
[1]