免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2788 | 回复: 0
打印 上一主题 下一主题

[转]谈谈python中类属性和类实例的属性的区别 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-12-15 21:03 |只看该作者 |倒序浏览
这几天python遇到了写困惑,正好有这么一篇文章给解决了,怕时间久了忘了,所以存一下。
               
               
                # coding: utf-8  
  
class AAA():  
    aaa = 10  
  
# 情形1   
obj1 = AAA()  
obj2 = AAA()   
print obj1.aaa, obj2.aaa, AAA.aaa   
      
# 情形2  
obj1.aaa += 2  
print obj1.aaa, obj2.aaa, AAA.aaa   
  
# 情形3  
AAA.aaa += 3  
print obj1.aaa, obj2.aaa, AAA.aaa  
在上面的代码,类AAA定义了一个属性aaa,py的类成员变量不像java或者c++那样有访问限定符,像aaa这样的属性定义应该理解为类属性
定义,即该定义为所有类AAA的实例所共享,访问该属性,可通过AAA.aaa的方式来访问,是通过类名来引用,但是如果通过类AAA的实例来引用aaa
属性,又会是怎样呢,我们来看情形1.
    对于情形1,我相信绝大多数人都会正确的说出结果,那就是:
        10  10  10
    对于上面这个结果,没有任何悬念,通过两个AAA的实例,以及通过AAA类名引用aaa属性值,都是同样的答案。

    那在情形2中,应该是什么结果呢,我相信大多数人还是会说出正确的结果:
        12  10  10
    在上面这个结果中,一旦执行了obj1.aaa +=
2,也就意味着obj1这个实例有了个实例的属性值,他的属性名称也为aaa,那是不是obj1的aaa是个新的属性呢,实际上可以说法是对,但也不对,
实际上obj1.aaa +=
2这个代码的执行,并不像我们想象的那么简单,首先他会到obj1所属的类AAA的属性列表中去找一个名称为aaa的属性,如果有,他就会返回该值作为
obj1中aaa的初始值,也就是说,这以后obj1.aaa的这个属性值跟AAA.aaa就基本没有关系了。

    那在情形3中呢,答案是什么呢:
        12  13  13
    这又怎么说呢,其实很简单,AAA.aaa对AAA类属性做了一次设置,obj1.aaa经过一次+=操作后,实际上与AAA.aaa脱离了关系,而obj2.aaa没有经过任何的属性操作,因此其只会从其所属的类AAA中去获得aaa,并返回。
对于上面的过程,我把代码加上几行,如下:
# coding: utf-8  
  
class AAA():  
    aaa = 10  
  
obj1 = AAA()  
obj2 = AAA()  
print obj1.aaa, obj2.aaa, AAA.aaa  
print obj1.__dict__, obj2.__dict__, AAA.__dict__  
  
obj1.aaa += 2  
print obj1.aaa, obj2.aaa, AAA.aaa   
print obj1.__dict__, obj2.__dict__, AAA.__dict__  
  
AAA.aaa += 3  
print obj1.aaa, obj2.aaa, AAA.aaa  
print obj1.__dict__, obj2.__dict__, AAA.__dict__
执行该代码,有如下的结果:

10 10 10
{} {} {'__module__': '__main__', 'aaa': 10, '__doc__': None}
12 10 10
{'aaa': 12} {} {'__module__': '__main__', 'aaa': 10, '__doc__': None}
12 13 13
{'aaa': 12} {} {'__module__': '__main__', 'aaa': 13, '__doc__': None}

   
看了这个结果,我想读者应该明白了,在py中任何东西都是对象,一个类,比如AAA一旦被加载,那么py就会把类AAA也视同为对象,那么AAA的那些实
例呢,只会在必要的时候到他这里取一些值去用,这些个实例可都是不同的对象哦,基于这个道理,就很好理解py的这个属性机制了。


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u3/103690/showart_2122286.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP