Python中类属性和实例属性的区别,,在Python中经常
Python中类属性和实例属性的区别,,在Python中经常
在Python中经常会混淆类属性和实例属性的概念,今天专门记录一下个人理解以免日后忘记。
看下面的例子:
class Tencent(): i = 10 # 此处i为类属性 def __init__(self,name): self.name = name # 此处name为实力属性 def function(self): print(self.name)a = Tencent(100) #实例化print(a.i)print(a.name)print(Tencent.i)
运行当然是没有问题的,输出结果为:
1010010
但是当我们加入这样一段代码:
print(Tencent.name)
运行后会报错,这是因为不能通过类名+属性名的方式去调用实例属性,当类实例化后,只能通过类名去调用方法中的属性。
下面进行这样的操作:
Tencent.i += 1print(a.i)print(Tencent.i)
输出结果为:
1111
然后再进行:
a.i + = 1print(a.i)print(Tencent.i)
输出结果则为:
1110
Why?同样是对类属性的修改,为什么用不通的调用方式修改后输出的值却不一样呢?
我自己的解释如下:
当我们使用实例名+属性名,即a.i的方式修改属性i的值时:相当于新建了一个i的副本,+1这个操作实际上是进行在这个i的副本上的,而当我们用类名+属性名的方式调用i时,输出的其实是原封未动的类属性i
验证如下:
print(id(a.i)
print(Tencent.i)
a.i += 1print(a.i,end=" "),print(id(a.i)) #输出修改后a.i的内存地址print(Tencent.i,end=" "),print(id(Tencent.i)) #输出修改后Tencent.i的内存地址
输出结果为:
140712785339504
140712785339504
11 140712785339536
10 140712785339504
结果显示,修改前后,类属性i的内存地址其实是没有变的,通过实例调用修改i其实只是修改了副本。
同理,假如我们直接通过类名的调用方式来修改i,结果为:
print(id(a.i))print(id(Tencent.i))Tencent.i += 1print(a.i,end=" "),print(id(a.i))print(Tencent.i,end=" "),print(id(Tencent.i))14071278533950414071278533950411 14071278533953611 140712785339536
可以看到,如果我们直接使用类名+属性名的方式修改i,那么在修改后i的值确确实实的是变了。
Python中类属性和实例属性的区别
相关内容
- python3转义字符,新手用python2还是3,转义字符作用描述使
- Python 绝对路径添加,相对路径和绝对路径举例,import
- python中类与对象之继承,python类和对象理解,面对对象的
- ArcGIS python 退出,python强制退出,os._exit(0
- python datetime获取几分钟、小时、天之前的时间,,impor
- python文件打开方式详解——a、a+、r+、w+区别,,r只读,
- python goatools使用,,用david搞定了所
- gdal和python在windows上的安装,,GDAL is a
- python Crypto AES-256-ECB 与PHP之间完成加解密,,AES算法描述
- python之爬虫(爬取.ts文件并将其合并为.MP4文件——以及
评论关闭