前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python的实例属性和类属性

Python的实例属性和类属性

作者头像
哒呵呵
发布2018-08-06 14:12:43
7130
发布2018-08-06 14:12:43
举报
文章被收录于专栏:鸿的学习笔记鸿的学习笔记

类属性指的是定义在class内部的,而实例属性是则与某个特定的实例(对象)有关。定义过于抽象了,看看例子。

代码语言:javascript
复制
   class Book:
     num_pages = 100

     def __init__(self, name):
         self.name = name

tricks = Book('tricks')
fluent = Book('fluent')
tricks.num_pages, fluent.num_pages #这个就是实例属性
Out[48]: (100, 100)
Book.num_pages #这个就是类属性
Out[49]: 100

目前的一切看起来很正常,但是如果类属性想要访问init方法构建的,属于每个实例的实例属性。

代码语言:javascript
复制
Book.name
Traceback (most recent call last):

  File "<ipython-input-50-213752b711a8>", line 1, in <module>
    Book.name

AttributeError: type object 'Book' has no attribute 'name'

Python解释器会告诉你,Book这个类没有属性name。而这个就是实例属性和类属性最大的差别。不过还需要注意到的问题是:

代码语言:javascript
复制
Book.num_pages=19
tricks.num_pages, fluent.num_pages
Out[52]: (19, 19)

我们修改了类属性num_pages,实例tricks,fluent也发生了改变。再看看:

代码语言:javascript
复制
tricks.num_pages=20
tricks.num_pages, fluent.num_pages
Out[54]: (20, 19)
Book.num_pages
Out[55]: 19

我们修改了实例tricks的num_pages,但是fluent没有受到影响,并且Book类属性也没有受到影响。不过如果我们调用内部的__class__方法:

代码语言:javascript
复制
tricks.num_pages, tricks.__class__.num_pages
Out[57]: (20, 19)

我们注意到__class__没有受到影响。 从上面的例子中发现,在以后写代码时需要小心类属性和实例属性的作用域的范围。否则一不小心就会出现bug。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-04-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 鸿的学习笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档