鱼C论坛

 找回密码
 立即注册
查看: 1267|回复: 8

[已解决]类属性的疑惑

[复制链接]
发表于 2019-6-10 12:45:52 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
>>> class BB:
        x = 0
        def __init__(self,x):
                self.x+=x

               
>>> bb=BB(1)
>>> bb.x
1
>>> BB.x
0
>>> class BB:
        x = []
        def __init__(self,x):
                self.x.append(x)

               
>>> BB(1)
<__main__.BB object at 0x000001F5ED345E80>
>>> BB.x
[1]

我想发截图 但是无法上传  点击选择文件上传后一会上传的图片就消失了 也不知道是为啥 所以就把我的试验结果copy过来了
如上所示 为何 类属性x是列表的时候,调用方法 直接把x更改了


最佳答案
2019-6-10 21:44:28
关于类的数据属性,不要看名字,要看是对类对象属性还是实例对象属性,比如你贴的BB.x和bb.x,这两个是不一样的,我贴个网址参考,这个总结的很好:https://www.cnblogs.com/crazyrunning/p/6945183.html
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-6-13 21:27:43 | 显示全部楼层
wwhywhy 发表于 2019-6-11 11:15
我再重新解释一下python的类和对象。他们都是可以可以操作的。
这个跟C,C++啥的不一样。(它们要实例化 ...

感谢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-6-11 11:15:43 | 显示全部楼层
加油fighting 发表于 2019-6-10 20:46
所以意思是 数字是不可变的对象,而列表可变 所以列表对象就被更改了是吧

ps:实例对象属性我一直认为 ...

我再重新解释一下python的类和对象。他们都是可以可以操作的。
这个跟C,C++啥的不一样。(它们要实例化才可以使用)
我自己的一种变通的理解就是:python中,类本身就是实例。这样不知能否方便你理解?
python中的方法(也就是属性)不存在什么private,protect,public之类的。统统都可以访问的(有些细节要注意)
所以,对于你定义的第一种类BB:
bb是它的实例对象。所以值被修改为1,所以bb.x = 1
但是对于类BB,它的值,你是没有修改的。所以BB.x=0
这样能理解了吗?
如果你要查看BB的值,可以这么看:
BB(5).x
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-6-10 21:44:28 | 显示全部楼层    本楼为最佳答案   
关于类的数据属性,不要看名字,要看是对类对象属性还是实例对象属性,比如你贴的BB.x和bb.x,这两个是不一样的,我贴个网址参考,这个总结的很好:https://www.cnblogs.com/crazyrunning/p/6945183.html
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-6-10 21:36:40 | 显示全部楼层
加油fighting 发表于 2019-6-10 20:46
所以意思是 数字是不可变的对象,而列表可变 所以列表对象就被更改了是吧

ps:实例对象属性我一直认为 ...

不管是类对象属性绑定class_name.attr_name = attr_value实例对象属性绑定是instance_name.attr_name = attr_value,这里是self.x.append(x)。这可不是属性绑定语句。
至于实例对象属性不一定都是实例化来的,你做个对比就知道了,例如:这个实例化对象属性中根本就没有,去找类属性。
  1. >>> class BB:
  2.         x = 1
  3.         def __init__(self):
  4.                 print(self.x)

  5.                
  6. >>> b = BB()
  7. 1
复制代码

这个就很明显了把。

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-6-10 20:46:37 | 显示全部楼层
都淡忘 发表于 2019-6-10 17:16
三个问题
1.类对象属性和实例对象属性
2.类对象属性绑定和实例对象属性绑定

所以意思是 数字是不可变的对象,而列表可变 所以列表对象就被更改了是吧

ps:实例对象属性我一直认为是类对象属性实例化来的 所以你说的self.x实例对象属性没有然后去查找类对象属性 我不太理解 我觉得这个就是实例的属性啊 不然self是啥?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-6-10 17:16:47 | 显示全部楼层
本帖最后由 都淡忘 于 2019-6-10 21:54 编辑

三个问题
1.类对象属性和实例对象属性
2.类对象属性绑定和实例对象属性绑定
3类对象属性引用和实例对象属性引用
解答:
1.类对象属性是所有实例化对象实时共享的,而实例对象属性则是“绑定”了实例对象,也就是self的意义。
2.不管是类对象属性绑定还是实例对象属性绑定,都是要依托对象存在而存在,属性存在则改写,不存在则新增。类对象属性绑定是class_name.attr_name = attr_value实例对象属性绑定是instance_name.attr_name = attr_value。
3.这里只说明对于数据属性的引用。类对象数据属性引用class_name.attr_name。而实例对象数据属性引用则有两个规则:
a.先到实例对象中查找属性,再到类属性中查找,没有则异常
b.属性绑定语句总是为实例对象创建新属性。属性存在时,则更新属性指向的对象。
严格遵守这三条,现在回头过来看第一个代码:
bb = BB(1) #创建实例对象,并自动调用魔方方法,传入参数1,重点来了self.x = self.x + x,第二个self.x先到实例对象中找,现在还没有这个属性,于是到类中找,于是这个self.x 是0,这个x是传入的参数1,0 + 1 是1 ,于是这里这个实例对象属性x绑定了1,这行代码结束
bb.x指向刚刚的绑定的1,实例对象的数据属性引用
BB.x是类对象数据属性引用,是定义的那个0。
下面来看第二段代码:
注意哦,这里的类对象数据属性是列表,列表是可变对象!!
self.x.append(x)并不是属性绑定语句,同样的self.x实例对象属性并没有,去类属性里找,找到了,这个self.x是个空列表,self.x.append(x),于是修改类属性x。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-6-10 16:16:16 | 显示全部楼层
wwhywhy 发表于 2019-6-10 13:53
python中类和对象是在不同的域空间中。都可以直接使用的。
所以,你可以直接使用你定义的类,并赋值:
BB ...

但是x是数字0的时候并没有变化啊?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-6-10 13:53:38 | 显示全部楼层
python中类和对象是在不同的域空间中。都可以直接使用的。
所以,你可以直接使用你定义的类,并赋值:
BB(1)
这里就会调用你定义的属性def __init__中的append,将x增加一个值。所以显示的结果就是x从[]变成了x[1]
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-10-19 03:39

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表