python 理解类变量与实例变量

实例的属性存储在实例的dict中。

类属性和方法存储在类的dict中。

查找属性的顺序:特性->实例的dict->类的dict->基类。
如果都不存在就会抛出异常。

class aa:
    w = 10
    def __init__(self):
        self.x = 11
        self.y = 12
    def add(self):
        return self.x + self.y
 
a = aa()
print a.add()
 
aa.w = 20
a.w = 13
print aa.w, a.w
 
a.t = 14
a.q = 15
print a.t, a.q
 
aa.m = 30
aa.n = 40
print aa.m, aa.n
 
b = aa()
print b.x, b.y
print b.t, b.q
print b.m, b.n
 
#输出
23
20 13
14 15
30 40
11 12
Traceback (most recent call last):
  File "100tests.py", line 508, in <module>
    print b.t,b.q
AttributeError: aa instance has no attribute 't'
>>> class aa():
...     w = 10
... 
>>> print aa.__dict__
{'__module__': '__main__', '__doc__': None, 'w': 10}
>>> a = aa() # 建立实例a
>>> a.w = 13 # 为实例a添加属性
>>> aa.__dict__
{'__module__': '__main__', '__doc__': None, 'w': 10}
>>> #实例a的属性并未添加到类属性中
... 
>>> aa.m = 30 # 添加类属性m
>>> aa.n = 40 # 添加类属性n
>>> aa.__dict__
{'__module__': '__main__', 'm': 30, '__doc__': None, 'w': 10, 'n': 40}
>>> # m, n 已添加到类字典中,此时b = aa() 建立新实例b, 当查找b.m时首先查找实例b的字典b.__dict__,其中不含m属性,因此向上查找b所属的类aa的属性m=30
... 
>>> # 而查找b.x时,实例b的字典和类aa的字典中都无x属性,因此抛出异常
... 
>>> 

试下以下代码会有更好地理解

class foo():
    w = 10
f = foo()
f.w = 20
print f.w # 结果为20
del f.w
print f.w # 结果为10

在 Python 中没有常量。如果你试图努力的话什么都可以改变。这一点满足 Python 的核心原则之一:坏的行为应该被克服而不是被取缔。如果你真正想改变 None的值,也可以做到,但当无法调试的时候别来找我。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 定义类并创建实例 在Python中,类通过 class 关键字定义。以 Person 为例,定义一个Person类...
    绩重KF阅读 9,414评论 0 13
  • 要点: 函数式编程:注意不是“函数编程”,多了一个“式” 模块:如何使用模块 面向对象编程:面向对象的概念、属性、...
    victorsungo阅读 5,501评论 0 6
  • Python基础-类变量和实例变量 写在前面 如非特别说明,下文均基于Python3 大纲: 1. 类变量和实例变...
    理查德成阅读 4,233评论 0 7
  • Python进阶框架 希望大家喜欢,点赞哦首先感谢廖雪峰老师对于该课程的讲解 一、函数式编程 1.1 函数式编程简...
    Gaolex阅读 10,862评论 6 53
  • “在陆地的人总是想看见海,在海里的人总是想遇见岛,在岛上的人总是想去陆地。” 本来是冥想,突然想到自己在海...
    沉吟大叔阅读 4,023评论 0 5