鱼C论坛

 找回密码
 立即注册
查看: 3826|回复: 17

python的类属性和对象属性!

[复制链接]
发表于 2015-6-8 17:24:43 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 ~风介~ 于 2015-6-8 23:31 编辑
  1. class Person:
  2.         population = 0
  3.        
  4.         def __init__(self,name):
  5.                 self.name = name
  6.                 print '(Initializing %s)' %self.name
  7.                 self.population += 1
  8.                 Person.population += 1[color=Red]#(为什么这一句会改变对象属性的输出?)[/color]

  9.         def howMany(self):
  10.                 if self.population == 1:
  11.                         print 'I am the only person here.'
  12.                 else:
  13.                         print 'We are %s persons here.' % self.population

  14.                
  15.                 print self.population
  16.                 print Person.population
  17.        
  18. swaroop = Person('aaaaa')
  19. swaroop.howMany()

  20. kalam=Person('bbbbb')
  21. kalam.howMany()
  22.                
  23. caifei=Person('hhhhh')
  24. kalam.howMany()         
复制代码


当程序中没有Person.population += 1这一逻辑行时,self.population=1总成立!可当有Person.population += 1这一逻辑行时,self.population却等于2了,这是为什么呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2015-6-8 21:23:03 | 显示全部楼层
因为你调用了两次啊。当然就等于2了
self.population调用一次
Person.popuation又调用了一次

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
~风介~ + 5 + 5 感谢楼主无私奉献!

查看全部评分

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

使用道具 举报

发表于 2015-6-8 17:29:50 | 显示全部楼层
:mad:
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2015-6-8 17:59:06 | 显示全部楼层

想知道您这个表情是什么意思?你为什么生气发怒呢!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-6-8 22:21:25 | 显示全部楼层
两句的效果是一样的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-6-8 23:32:46 | 显示全部楼层
dairenyihao 发表于 2015-6-8 17:59
想知道您这个表情是什么意思?你为什么生气发怒呢!

不用理他——灌水党~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-6-9 08:48:11 | 显示全部楼层
FavouritePython 发表于 2015-6-8 21:23
因为你调用了两次啊。当然就等于2了
self.population调用一次
Person.popuation又调用了一次

不对啊 self.population是对象的属性,而Person.population是类的属性,两者之间应该没有关系的才对。如果没有Person.population+=1这句命令,那么不管实例化多少对象self.population每次的结果都是1.但如果有Person.population+=1这句命令,本例中共实例化三个对象,最后self.population=2,而Person.population=3,这是为什么呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-6-9 08:52:11 | 显示全部楼层
james007 发表于 2015-6-8 22:21
两句的效果是一样的

不对啊 self.population是对象的属性,而Person.population是类的属性,两者之间应该没有关系的才对。如果没有Person.population+=1这句命令,那么不管实例化多少对象self.population每次的结果都是1.但如果有Person.population+=1这句命令,本例中共实例化三个对象,最后self.population=2,而Person.population=3,这是为什么呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-6-9 10:46:58 | 显示全部楼层
dairenyihao 发表于 2015-6-9 08:52
不对啊 self.population是对象的属性,而Person.population是类的属性,两者之间应该没有关系的才对。如 ...

不不不,你一个类编写完以后就是类对象了,self.population其实和Person.population是一样的。这个self其实就是Person.
还有你最好是把你实际调用的复制出来看看。不知道你是如何调用出3的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-6-9 16:44:48 | 显示全部楼层
FavouritePython 发表于 2015-6-9 10:46
不不不,你一个类编写完以后就是类对象了,self.population其实和Person.population是一样的。这个self其 ...


                               
登录/注册后可看大图
这是没有Person.population+=1的情况

                               
登录/注册后可看大图
这是Person.population+=1的情况
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-6-9 17:27:28 | 显示全部楼层
我也同意二楼的观点,在你的第一个函数里面开始调用了self的population方法,之后又调用了一次person的population方法
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-6-9 17:58:23 | 显示全部楼层
loco_v 发表于 2015-6-9 17:27
我也同意二楼的观点,在你的第一个函数里面开始调用了self的population方法,之后又调用了一次person的popu ...

可是最后的输出不同意噢,见10的图片回复。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-6-9 20:00:38 | 显示全部楼层
dairenyihao 发表于 2015-6-9 16:44
这是没有Person.population+=1的情况
这是有Person.population+=1的情况

图片根本读不出来。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-6-9 23:17:39 | 显示全部楼层
运行了楼主的程序(虽然是py3,但是这段代码中只有print函数有区别),输出是这样的:
  1. (Initializing aaaaa)
  2. I am the only person here.
  3. 1
  4. 1
  5. (Initializing bbbbb)
  6. We are 2 persons here.
  7. 2
  8. 2
  9. (Initializing hhhhh)
  10. We are 2 persons here.
  11. 2
  12. 3
复制代码

先说说我对这段程序的理解:
主程序部分是这几段代码
  1. swaroop = Person('aaaaa')
  2. swaroop.howMany()

  3. kalam=Person('bbbbb')
  4. kalam.howMany()
  5.                
  6. caifei=Person('hhhhh')
  7. kalam.howMany()         
复制代码
swaroop = Person('aaaaa')
创建一个新的Person类的实例,swaroop,会调用__init__方法,但是self.population的自增先于,Person.population的自增,所以swaroop实例的population变量是在0的基础上加1,而Person类的population变量由于Person.population += 1这一句也变成了1。然后,调用howMany方法时打印结果1,1
我语言比较渣,看图
问题说明.jpg

下面的分析同理 ,值得指出的是楼主的程序中,在最后一个caifei变量创建之后,紧接着调用的并不是caifei这个变量的howMany方法而是上一个变量kalam变量的howMany方法,这也是为什么最后一次打印中self.population和Person.population打印结果不同的原因,因为这里的self指代的是kalam,另外,我尝试把self.population的自增和Person的自增改变了顺序,输出是这样的   
  1. (Initializing aaaaa)
  2. We are 2 persons here.
  3. 2
  4. 1
  5. (Initializing bbbbb)
  6. We are 3 persons here.
  7. 3
  8. 2
  9. (Initializing hhhhh)
  10. We are 3 persons here.
  11. 3
  12. 3
复制代码
PS:提一句,上面的图是从一个代码分析网站截下来的,前期的学习可以多用用这样的工具,代码输入进去,点visualize按钮,然后在下来的界面中点forward可以一步步的看程序运行情况(当然你用某些ide的debug功能也是可以监控的,我只是觉得这个更直观~~),楼主学习加油


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

使用道具 举报

 楼主| 发表于 2015-6-10 08:52:02 | 显示全部楼层
lightninng 发表于 2015-6-9 23:17
运行了楼主的程序(虽然是py3,但是这段代码中只有print函数有区别),输出是这样的:

先说说我对这段程序 ...

可为什么如果没有Person.population += 1这句命令的话 print self.population每次的输出都是1呢?

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

使用道具 举报

发表于 2015-6-10 10:53:52 | 显示全部楼层
dairenyihao 发表于 2015-6-10 08:52
可为什么如果没有Person.population += 1这句命令的话 print self.population每次的输出都是1呢?

每个实例创建时都会从他所继承的类(这里是Person)获取自己的population属性的值,没有Person.population += 1这句,在__init__方法开始执行时,population就是0,所以在self.population += 1执行之后打印出来是1
PS:说实话,这种问题,好好的理解一下类创建的时候程序所做的事情,应该自己是没问题的,希望提问题前能加入自己的思考,另外昨天回贴的时候,忘了贴网站,这里贴出来,这些问题你可以通过这种可视化的网站自己摸索一下http://pythontutor.com/visualize.html#mode=edit
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-6-10 16:14:06 | 显示全部楼层
lightninng 发表于 2015-6-10 10:53
每个实例创建时都会从他所继承的类(这里是Person)获取自己的population属性的值,没有Person.population  ...

也许是我固执了,僵硬地认为类属性和对象属性之间没有任何关系,且彼此之间并不相互影响。总之,谢谢您仔细且精彩的回复!我是新手,怎么给你鱼币的?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-6-10 18:39:36 | 显示全部楼层
dairenyihao 发表于 2015-6-10 16:14
也许是我固执了,僵硬地认为类属性和对象属性之间没有任何关系,且彼此之间并不相互影响。总之,谢谢您仔 ...

你这不是悬赏贴,不用给了,点个支持意思一下就行了,新手的话,建议看看本版置顶的贴子【Python】The Art of Asking Questions
另外关于提问,下面这个贴子也挺好的,学会好的提问方式对自学的效率也很有帮助哦亲~~
http://phorum.vbird.org/viewtopic.php?t=96%E3%80%8F
PS:我对面向对象编程学的也不是很好,以前只学过C~~
加油吧,学习的路好长~~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-2-16 11:05

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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