码迷,mamicode.com
首页 > 编程语言 > 详细

Python中类属性和实例属性的区别

时间:2019-02-11 21:38:39      阅读:487      评论:0      收藏:0      [点我收藏+]

标签:使用   结果   修改   一段   end   UNC   报错   class   实例化   

在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)

运行当然是没有问题的,输出结果为:

10
100
10

 

但是当我们加入这样一段代码:

print(Tencent.name)

 

运行后会报错,这是因为不能通过类名+属性名的方式去调用实例属性,当类实例化后,只能通过类名去调用方法中的属性。

 

下面进行这样的操作:

Tencent.i += 1
print(a.i)print(Tencent.i)

输出结果为:

11
11

然后再进行:

a.i + = 1
print(a.i)
print(Tencent.i)

输出结果则为:

11
10

Why?同样是对类属性的修改,为什么用不通的调用方式修改后输出的值却不一样呢?

我自己的解释如下:

当我们使用实例名+属性名,即a.i的方式修改属性i的值时:相当于新建了一个i的副本,+1这个操作实际上是进行在这个i的副本上的,而当我们用类名+属性名的方式调用i时,输出的其实是原封未动的类属性i

验证如下:

 

print(id(a.i)
print(Tencent.i)
a.i += 1 print(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 += 1
print(a.i,end="  "),print(id(a.i))
print(Tencent.i,end="  "),print(id(Tencent.i))


140712785339504
140712785339504
11  140712785339536
11  140712785339536

可以看到,如果我们直接使用类名+属性名的方式修改i,那么在修改后i的值确确实实的是变了。

 

Python中类属性和实例属性的区别

标签:使用   结果   修改   一段   end   UNC   报错   class   实例化   

原文地址:https://www.cnblogs.com/LegendsNeverDie/p/10363195.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!