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]



    以上。

  • 相关阅读:
    array and ram
    char as int
    pointer of 2d array and address
    Install SAP HANA EXPRESS on Google Cloud Platform
    Ubuntu remount hard drive
    Compile OpenSSL with Visual Studio 2019
    Install Jupyter notebook and tensorflow on Ubuntu 18.04
    Build OpenCV text(OCR) module on windows with Visual Studio 2019
    Reinstall VirtualBox 6.0 on Ubuntu 18.04
    Pitfall in std::vector<cv::Mat>
  • 原文地址:https://www.cnblogs.com/f8master/p/3826080.html
Copyright © 2011-2022 走看看