文档章节

Python 类属性与实例属性的关联

突然帅了
 突然帅了
发布于 2015/04/26 08:34
字数 796
阅读 70
收藏 7

类属性是属于一个类的变量,就像是C++中类的静态成员变量,你只需将该属性定义在所有方法的作用域外,即为类属性,但一般是紧跟在类名后面,类属性为所有实例所共有,你可以通过 类名.属性 来调用类属性

>>> class A:  
    count = 0; #这就是类属性  
    def __init__(self):  
        A.count += 1  #每次调用该方法 count 自增 1  
    def output(self):  
        print(self.count)  
  
>>> a1 = A()  
>>> a1.output()  
1  
>>> A.count = 0  
>>> A.count  
0  
>>> a1.output()  (为什么会是0,后面会详细说明)
0

实例属性是属于实例自己的属性,你可以在任何方法中添加新的实例属性,甚至在类外添加,Python会在实例属性初次使用时,创建该属性并赋值

>>> class A:  
    def __init__(self):  
        self.num = 1  #添加实例属性num  
    def again(self,name):  
        self.name = name #添加实例属性name  
  
          
>>> a1 = A()  
>>> a1.num  
1  
>>> a1.name #这时实例 a1 中还没有实例属性 name  
Traceback (most recent call last):  
  File "<pyshell#38>", line 1, in <module>  
    a1.name #这时实例 a1 中还没有实例属性 name  
AttributeError: 'A' object has no attribute 'name'  
>>> a1.again('Jane')  
>>> a1.name #现在有了...  
'Jane'  
>>> a1.call = '123456' #添加a1的实例属性 call  
>>> a1.call  
'123456'

继续看下面的例子:

[python] view plaincopy
>>> class A:  
    count = 0  
    def __init__(self):  
        A.count += 1  
    def output(self):  
        print(self.count)  
  
          
>>> a1 = A()  
>>> a2 = A()  
>>> a3 = A()  
>>> A.count # A的类属性count这时为3  
3  
>>> A.count = 2 #更改A的类属性为2  
>>> a1.count,a2.count, a3.count, A.count #A的所有实例的count也同样改变  
(2, 2, 2, 2)  
>>> a1.count = 5 #通过A的一个实例a1更改count  
>>> a1.count, a2.count, a3.count, A.count #只有a1的count发生改变  
(5, 2, 2, 2)  
>>> A.count = 4 #再次更改A的类属性为4  
>>> a1.count, a2.count, a3.count, A.count  #这时a1的count还是保持为5  
(5, 4, 4, 4)

解释为什么会是0?

先看代码:

class base:
    count = 0
    def __init__(self):
        base.count += 1
    def output(self):
        print(self.count)
a1 = base()
a2 = base()
a3 = base()


print(base.count) # 3
a1.output() # 3  这里实例属性与类仍然还是共同引用一个count对象
base.count += 4
a1.output() # 3+4

print(base.count) # 3
print(a1.count) # 3 同理,共同引用一个count对象
base.count = 0 当改变类属性count时,实例属性count也跟着会变化
print(a1.count) # 0
class base:
    count = 0
    def __init__(self):
        base.count += 1
    def output(self):
        print(self.count)
a1 = base()
a2 = base()
a3 = base()


print(base.count) # 3
a1.count = 9  这个实例属性从类属性中分离出去
base.count += 4 因此类属性count的改变不会影响到实例属性count
print(base.count) # 7
print(a1.count) # 9

print(base.count) # 3
a1.count = 9
base.count += 4
print(base.count) # 7
a1.output() # 9

通过上面的例子我们可以看到,类属性为所有实例和类所共有,通过 类名.类属性 可以更改类属性,并且所有实例的类属性也随之改变,但通过 实例名.类属性 来改变类属性,该实例的该类属性会变为实例属性,而不影响其他实例的类属性,以后通过 类名.类属性 来更改类属性,也不会影响到该实例的这个属性了,因为它变为实例属性啦。



本文转载自:http://blog.csdn.net/bolike/article/details/21554901

上一篇: python 循环技巧
下一篇: 如何破译乱码
突然帅了
粉丝 8
博文 90
码字总数 28698
作品 0
西安
私信 提问
加载中

评论(1)

Chriesh
Chriesh
讲的不错,马克
python 面向对象编程之实例属性和类属性

python学习笔记,特做记录,分享给大家,希望对大家有所帮助。 实例属性和类属性 由于Python是动态语言,根据类创建的实例可以任意绑定属性。 给实例绑定属性的方法是通过实例变量,或者通过...

展菲
07/06
0
0
关于Python类属性与实例属性的讨论

标题名字有点长。 之所以想写这个文章是因为碰巧看到网上一篇关于Pyhon中类属性及实例属性区别的帖子。因为我之前也被这个问题困扰过,今天碰巧看到了这篇帖子,发现帖子的作者只是描述了现象...

_Zhao
2018/08/27
0
0
Python3 与 C# 面向对象之~封装

最新彩版:https://www.cnblogs.com/dotnetcrazy/p/9202988.html 在线编程:https://mybinder.org/v2/gh/lotapp/BaseCode/master 在线预览:http://github.lesschina.com/python/base/oop/1......

毒逆天
2018/06/20
0
0
Python基础-面向对象组合、继承、子类调父类

组合 多个数据属性通过一个类实例化的对象做关联 继承 通过集成可以派生(衍生)出新的方法 单继承 多继承 接口继承 父类规定子类必须要使用的类方法,方便程序归一化设计 接口继承示例 继承顺序...

ZHAO_JH
2018/04/13
25
0
python面向对象笔记(what)

python面向对象笔记(what) 1.什么是面向对象? 对象相当于把函数和全局变量封装起来,属相相当于全局变量,方法相当于函数。 不同对象相互隔离,全局变量互不影响。 2.什么是隐藏属性? 在方...

PowerMichael
2018/04/24
0
0

没有更多内容

加载失败,请刷新页面

加载更多

EDI 电子数据交换全解指南

EDI(Electronic Data Interchange,电子数据交换)技术使得企业与企业(B2B)实现通信自动化,帮助交易伙伴和组织更快更好地完成更多工作,并消除了人工操作带来的错误。从零售商到制造商、物...

EDI知行软件
56分钟前
2
0
CentOS7的LVM动态扩容

# 问题 CentOS7上面的磁盘空间有点紧张,需要扩容。 解决 查询当前磁盘状态 [root@xxx ~]# lsblkNAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTfd0 2:0 1 4K ...

亚林瓜子
今天
3
0
Kafka 0.8 Producer (0.9以前版本适用)

Kafka旧版本producer由scala编写,0.9以后已经废除 示例代码如下: import kafka.producer.KeyedMessage;import kafka.javaapi.producer.Producer;import kafka.producer.ProducerConfig;......

实时计算
今天
4
0
Giraph源码分析(八)—— 统计每个SuperStep中参与计算的顶点数目

作者|白松 目的:科研中,需要分析在每次迭代过程中参与计算的顶点数目,来进一步优化系统。比如,在SSSP的compute()方法最后一行,都会把当前顶点voteToHalt,即变为InActive状态。所以每次...

数澜科技
今天
6
0
Navicat 快捷键

操作 结果 ctrl+q 打开查询窗口 ctrl+/ 注释sql语句 ctrl+shift +/ 解除注释 ctrl+r 运行查询窗口的sql语句 ctrl+shift+r 只运行选中的sql语句 F6 打开一个mysql命令行窗口 ctrl+l 删除一行 ...

低至一折起
今天
13
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部