Python的静态成员变量和非静态成员变量

Python中,静态成员变量称为类变量,非静态成员变量称为实例变量。

基本概念

类变量:

类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。类变量在整个实例化的对象中是公用的。


实例变量:

定义在方法中的变量,用 self 绑定到实例上,只作用于当前实例的类。


访问方式

类变量:

在类内部和外部,类变量都用 ` 类名.类变量 的形式访问。在类内部,也可以用 self.类变量 来访问类变量,但此时它的含义已经变了,实际上它已经成了一个实例变量。在实例变量没有被重新赋值时,用 self.类变量` 才能访问到正确的值。简单的说就是实例变量会屏蔽掉类变量的值,就像局部变量屏蔽掉全局变量的值一样。所以一般情况下是不将类变量作为实例变量使用的。


实例变量:

在类内部,实例变量用 self.实例变量 的形式访问;在类外部,用 实例名.实例变量 的形式访问。实例变量是绑定到一个实例上的变量,它只属于这个实例。这一点区别于类变量,类变量是所有来自于同一个类的实例所共享的。


self 简介

类的方法与普通的函数只有一个特别的区别——它们必须有一个额外的第一个参数名称,但是在调用这个方法的时候你不为这个参数赋值,Python会提供这个值。这个特别的变量指对象本身,按照惯例它的名称是self。虽然你可以给这个参数任何名称,但是 强烈建议 你使用self这个名称。


实际上,实例变量就是一个用 self 修饰的变量。self 将一个变量绑定到一个特定的实例上,这样它就属于这实例自己。


举例说明
#! /usr/bin/env python
# -*- coding: utf-8 -*-


# *************************************************************
#     Filename @  classvar.py
#       Author @  Huoty
#  Create date @  2015-12-19 09:39:36
#  Description @  
# *************************************************************


class A(object):
    va = 10


    def foo(self):
        print A.va
        print self.va


        self.va = 40
        print A.va
        print self.va
        
        va = 20
        print va


        A.va = 15
        print A.va
        print self.va


# Script starts from here


obj1 = A()
obj2 = A()
obj1.foo()
print A.va
print obj1.va
print obj2.va


程序的输出结果:

10
10
10
40
20
15
40
15
40
15

分析程序结果我们发现,一般情况下,类变量可以用类名或者self的形式访问。当 self.类变量 被重新赋值时,它的值就发生了变化,但类变量的值不会随之变化。方法内的局部变量会屏蔽掉类变量和实例变量。类变量是所有实例共享的,而实例变量只属于对象自己,每个实例的实例变量可以有不同的值。


要点总结

1、类变量可以用 类名.类变量 和 self.类变量 两种方式访问,后者一般情况不建议使用。


2、类变量是所有对象所共享的,无论任何时候都建议用类名的方式访问类变量。


3、实例变量在类内部用 self 访问,在类外部用实例名访问。


4、类变量通过 self 访问时则被转化为实例变量,被绑定到特定的实例上,其值会屏蔽掉类变量。


5、通过对实例变量(self)的形式对类变量重新赋值后,类变量的值不随之变化。


6、方法内的局部变量会屏蔽掉类变量和实例变量。


7、同一实例变量在不同的实例中可能拥有不同的值。

你可能感兴趣的:(Python)