概述


本文主要介绍一些关于类变量、实例变量的一些基本内容

类、实例

  • :class,与面向对象中的类的概念相同
  • 实例:类的一个对象,与面相对象中的对象/实例的概念相同

类变量、实例变量


  • 类变量:类本身所拥有的变量。该类的所有实例可以共享的变量。
  • 实例变量:实例所拥有的变量

定义

  • 类变量
    通过在类中但是__init__函数外定义。例如:
class A(object):
  class_var = 0
  def __init__():
      pass

上面的例子在类A定义了类变量class_var

  • 实例变量
    通过在__init__函数内通过self定义。例如:
class A(object):
  def __init__():
      self.instance_var = 0

上面的例子在类A中定义类实例变量instance_var

类变量、实例变量访问方式

假设有个类AClass,对应的实例名称为a_instance,

假设类中的实例变量为[实例变量],类变量名称为[类变量]

  • 类变量
  • 通过class名称访问:AClass.[类变量]
  • 通过实例获取类,然后通过类访问:a_instance.__class__.[类变量]
  • 通过实例获取类,然后通过类访问:self.__class__.[类变量]
  • 通过实例访问:a_instance.[类变量]
  • 通过self访问:self.[类变量]
  • 通过cls访问:cls.[类变量]
  • 实例变量
  • 通过实例访问:a_instance.[实例变量]
  • 通过self访问:self.[实例变量]
  • 类变量与实例变量重名

如果有个重名的实例变量与类变量:[var],那么,

通过self.[var]a_instance.[var]访问count时,访问的是实例变量。

示例代码


完整代码

说明:如果该部分无法看懂,请跳过完整代码继续看后面代码详解的部分,然后再回过头来看。

# -*- coding:utf-8 -*-  

class A(object):
    count = 100
    index = 1000
    def __init__(self, count):
        self.count = count

    def add_count(self):
        self.count += 1

    def add_class_count(self):
        self.__class__.count += 100
        self.__class__.index += 1000

    def add_class_var_via_self(self):
        self.index += 1

    @classmethod
    def add_class_instance_var_via_cls(cls):
        cls.count += 100
        cls.index += 1000


def print_info():
    print "instance var(a.count)(%s):%s" % (id(a.count), a.count)
    print "class var(A.count)(%s):%s" % (id(A.count), A.count)
    print "class var(a.__class_count)(%s):%s" % (id(a.__class__.count), a.__class__.count)
    print "class var(a.index)(%s):%s" % (id(a.index), a.index)
    print "class var(A.index)(%s):%s" % (id(A.index), A.index)

print "\n\n==================="
a = A(1)
print_info()


print "\n\n==================="
print "修改实例变量:a.add_count()"
a.add_count()
print_info()


print "\n\n==================="
print "通过类本身修改类变量:A.count += 1"
A.count += 100
print_info()


print "\n\n==================="
print "通过实例方法修改类变量:a.add_class_count()"
a.add_class_count()
print_info()


print "\n\n==================="
print "实例方法中通过self修改类变量:a.add_class_var_via_self()"
a.add_class_var_via_self()
print_info()


print "\n\n==================="
print "再次通过实例方法修改类变量:a.add_class_count()"
a.add_class_count()
print_info()

print "\n\n==================="
print "通过类方法修改类变量:A.add_class_instance_var_via_cls()"
A.add_class_instance_var_via_cls()
print_info()

代码详解-定义

  • 类变量

在类中,init函数外通过下面代码定义了两个类变量:countindex

count = 100
    index = 1000
  • 实例变量

init函数中定义了1个实例变量:count

def __init__(self, count):
        self.count = count

注意:可以看到例子中类变量与实例变量重名:count

代码详解-输出结果

def print_info():
    print "instance var(a.count)(%s):%s" % (id(a.count), a.count)
    print "class var(A.count)(%s):%s" % (id(A.count), A.count)
    print "class var(a.__class_count)(%s):%s" % (id(a.__class__.count), a.__class__.count)
    print "class var(a.index)(%s):%s" % (id(a.index), a.index)
    print "class var(A.index)(%s):%s" % (id(A.index), A.index)

该函数通过多种方法来输出实例变量、类变量。

另外,id(xxxx)用来展示变量的id,方便区分变量

代码详解-(类定义中)变量修改&输出结果

说明:

类定义表示在类的定义中,主要是通过self、cls等访问相关变量。

def add_count(self):
        self.count += 1

    def add_class_count(self):
        self.__class__.count += 100
        self.__class__.index += 1000

    def add_class_var_via_self(self):
        self.index += 1

    @classmethod
    def add_class_instance_var_via_cls(cls):
        cls.count += 100
        cls.index += 1000
  • add_count函数:对实例变量count进行修改
  • add_class_count:对类变量countindex进行修改
  • add_class_var_via_self:对类变量index进行修改
  • add_class_instance_var_via_cls是类方法:对类变量countindex进行修改

代码详解-(类定义外)在类变量修改&输出结果

说明:

类定义外表示类的定义外,主要是通过类名(AClass)实例(a_instance)来访问类变量、实例变量。

该部分代码主要体现在print_info函数中。

输出结果

整个程序的输出结果如下,通过上面的分析,可以对比下输出与自己期望的结果是否相同。

===================
instance var(a.count)(140463984096376):1
class var(A.count)(140463984097952):100
class var(a.__class_count)(140463984097952):100
class var(a.index)(140463983067912):1000
class var(A.index)(140463983067912):1000


===================
修改实例变量:a.add_count()
instance var(a.count)(140463984096352):2
class var(A.count)(140463984097952):100
class var(a.__class_count)(140463984097952):100
class var(a.index)(140463983067912):1000
class var(A.index)(140463983067912):1000


===================
通过类本身修改类变量:A.count += 1
instance var(a.count)(140463984096352):2
class var(A.count)(140463984101480):200
class var(a.__class_count)(140463984101480):200
class var(a.index)(140463983067912):1000
class var(A.index)(140463983067912):1000


===================
通过实例方法修改类变量:a.add_class_count()
instance var(a.count)(140463984096352):2
class var(A.count)(140463983125648):300
class var(a.__class_count)(140463983125648):300
class var(a.index)(140463983067864):2000
class var(A.index)(140463983067864):2000


===================
实例方法中通过self修改类变量:a.add_class_var_via_self()
instance var(a.count)(140463984096352):2
class var(A.count)(140463983125648):300
class var(a.__class_count)(140463983125648):300
class var(a.index)(140463983067720):2001
class var(A.index)(140463983067864):2000


===================
再次通过实例方法修改类变量:a.add_class_count()
instance var(a.count)(140463984096352):2
class var(A.count)(140463983067744):400
class var(a.__class_count)(140463983067744):400
class var(a.index)(140463983067720):2001
class var(A.index)(140463983125648):3000


===================
通过类方法修改类变量:A.add_class_instance_var_via_cls()
instance var(a.count)(140463984096352):2
class var(A.count)(140463983067864):500
class var(a.__class_count)(140463983067864):500
class var(a.index)(140463983067720):2001
class var(A.index)(140463983067744):4000

至此,关于类变量、实例变量的相关内容已经完成。