分享

python中类属性与实例属性的区别

 flyk0tcfb46p9f 2019-04-30

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) # 输出2

print(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了。大家可以想一下在函数内部的全局变量的取值与修改的情况,是一个道理。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多