首先来看如下一段代码:
1 class Demo(object):2 def __init__(self):3 self.name = 'Tom'4 d = Demo().name = 'Linda'5 print (d) #结果为:Linda6 print (Demo().name) #结果为:Tom
问题:在第4行代码中,将Demo().name赋值给了变量d,为什么第5行中变量d的值和第6行中Demo().name的值不一样呢?
分析:
1、公有实例属性的概念:通过类的实例定义的归属于类的实例的属性,就是公有实例属性,本例中self.name就是一个公有实例属性
2、公有实例属性的一个特性就是其必须由类的实例来进行修改和访问,不能通过类来进行修改和访问
3、这两者有什么区别吗?有,这个区别就是本例中的问题的答案。因为引用一个类,这个引用不会对类进行实例化;而调用一个类的实例,则会对这个类进行实例化。
4、类的实例化会造成什么后果?就是第2行中的那个__init__方法,类的实例化会触发该方法对类进行初始化操作,现在应该看得比较清楚了。
5、第4行将'Linda'同时赋值给了Demo().name和变量d,此时Demo().name和变量d的值都是'Linda';第5行打印变量d的值,输出为'Linda';第6行打印Demo().name的值,按说应该也是'Linda',但是不要忘记,Demo().name是对公有实例属性调用,仔细看这个调用方法,前面说过了,对公有实例属性的调用必须由类的实例来进行,也就是Demo()而不是Demo,Demo()直接触发了__init__方法的执行,该方法中又将公有实例属性name初始化为了'Tom',所以最后Demo().name的值又变回了'Tom',而不是'Linda'。