美文网首页
python 理解类变量与实例变量

python 理解类变量与实例变量

作者: FaiChou | 来源:发表于2016-04-10 21:24 被阅读2284次

    实例的属性存储在实例的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 理解类变量与实例变量

          本文链接:https://www.haomeiwen.com/subject/lkablttx.html