zoukankan      html  css  js  c++  java
  • python 的 类属性 与 实例属性

    python中类属性与其被定义的类绑定,和任何实例都无关。

    对于类属性的访问,可以通过 类名+“.” + 属性名的方式来访问(如以下示例的Person.age);也可以通过类的实例+“.” + 属性名的方式(如以下示例最初使用的p.age),但此时需要有一定要求,那就是,该实例没有与类变量同名的变量,因为如果实例含有与类属性同名的属性,则用该实例访问属性时,访问的是实例中的属性。

    而对类属性的值的修改,只能通过类名的访问加以实现。(此处存在一点例外,最后会加以说明)

    以下通过一段实例代码加以说明:


    >>> class Person():
    	age =10
    
    >>> p = Person()
    >>> print Person.age , p.age
    10 10
    >>> Person.age +=1
    >>> print Person.age , p.age
    11 11
    >>> p.age += 1
    >>> print Person.age , p.age
    11 12



    在以上的操作中,定义了Person类和age的类属性,对于实例p,当它不存在同名的实例变量age的时候,Person.age和p.age均可访问类变量;

    然而,当p.age += 1 之后,就意味着p这个实例具有了一个属性age,恰恰与Person类的属性age同名。这样,p.age则访问的是p的实例属性,而非Person类的属性。

    进一步的,我们可以通过调用.__dict__,看一看。


    >>> print Person.__dict__ ,p.__dict__
    {'__module__': '__main__', 'age': 11, '__doc__': None} {'age': 12}


    那么实例对象的影响会持续到什么时候?事实上,只要实例对象被del掉,还是可以通过p.age来访问类变量的。


    >>> del p.age
    >>> print Person.age , p.age
    11 11
    >>> print Person.__dict__ ,p.__dict__
    {'__module__': '__main__', 'age': 11, '__doc__': None} {}


    以上说到:而对类属性的值的修改,只能通过类名的访问加以实现,此处存在特殊情况。而特殊情况就是:当类属性是一个可变对象(如字典,序列)时,就可以通过实例来对其加以修改。

    >>> class Person():
    	age = {'zhousui':10}
    	num = [1,2,3,4]
    
    	
    >>> p = Person()
    >>> print Person.age['zhousui'] , p.age['zhousui']
    10 10
    >>> print Person.num[0] , p.num[0]
    1 1
    >>> Person.num[0] = 10
    >>> print Person.num[0] , p.num[0]
    10 10
    >>> p.num[0] = 20
    >>> print Person.num[0] , p.num[0]
    20 20
    >>> print Person.num
    [20, 2, 3, 4]



    以上。

  • 相关阅读:
    【面霸2】
    【面霸1】php知识点
    【技术宅11】php入门运算
    【技术宅10】顺序二分查找算法
    【技术宅9】遍历一个文件夹下的所有文件和子文件夹
    【技术宅7】一个或多个虚拟主机配置方法
    【技术宅6】把一个无限级分类循环成tree结构
    【技术宅5】抓去网页数据的3种方法
    【技术宅4】如何把M个苹果平均分给N个小朋友
    【技术宅3】截取文件和url扩展名的N种方法
  • 原文地址:https://www.cnblogs.com/f8master/p/3826080.html
Copyright © 2011-2022 走看看