概述
本文主要介绍一些关于类变量、实例变量的一些基本内容
类、实例
- 类: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函数外通过下面代码定义了两个类变量:count
、index
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:对类变量
count
、index
进行修改 - add_class_var_via_self:对类变量
index
进行修改 - add_class_instance_var_via_cls是类方法:对类变量
count
、index
进行修改
代码详解-(类定义外)在类变量修改&输出结果
说明:
类定义外
表示类的定义外,主要是通过类名(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
至此,关于类变量、实例变量的相关内容已经完成。