python的类属性与实例属性,初学者很容易搞混,在这里,平哥给大家举个例子就能很好的理解了。 我们以人为例,正常的人类都是两条胳膊两条腿。先定义一个人类:class Person: :::::::::legs = 2 #类属性 :::::::::def __init__(self, name): :::::::::::::::self.name = name # 实例属性self.name注意一下注释里面说明,哪些是类属性,哪些是实例属性,由self.xxxx的都是实例属性 然后实例化二个人,一个叫张三,一个叫李四 zhangsan = Person('张三') lisi = Person('李四', ) 我想这里大家应该是没有疑问的 然后如下操作: print(zhangsan.name) # 输出张三print(zhangsan.legs) # 输出2print(lisi.name) # 输出李四print(lisi.legs) #输出2这里大家应该也没有疑问,如果有疑问就是类的定义与实例使用还没有掌握,可以看平哥的手册 现在大家思考下面的代码会发生什么? Person.legs = 4 #修改了类属性的值 print(zhangsan.legs) #输出多少 print(lisi.legs) # 输出多少 这里的答案是4, 因为legs是类的属性,所有的实例共同享有这一属性值,修改后,所有实例的该值就会立即变化。 接下来再看下面这段代码: zhangsan.name = '王五' print(lisi.name) #这里输出李四还是王五?# 也就是实例张三改名会不会影响李四的名字答案是“李四 ”,不受影响,否则,就乱套了。 这是为什么呢?就是因为name是实例属性,每个实例的实例属性都是独立的,每个实例无论是创建还是修改还是销毁实例属性,都不会影响其他实例 要注意的问题是什么? zhangsan.legs = 100 # 张三很无聊,修改了legs的值 print(lisi.legs) # 李四现在有几条leg? 答案:还是4条,那有同学要问了,legs不是类的属性吗,一旦修改,所有的实例都跟着修改。这句话非常正确,错误的地方是因为zhangsan.legs = 100之后,事实上并没有修改Person.legs,而是自己创建一个新的实例属性legs。此legs已经不是原来的legs了。大家可以想一下在函数内部的全局变量的取值与修改的情况,是一个道理。 |
|
来自: flyk0tcfb46p9f > 《AI》