Python双下划线引发的学习-类变量、实例变量
2016-04-12 00:12
691 查看
概述
本文主要介绍一些关于类变量、实例变量的一些基本内容类、实例
类: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
至此,关于类变量、实例变量的相关内容已经完成。
相关文章推荐
- Python动态类型的学习---引用的理解
- Python3写爬虫(四)多线程实现数据爬取
- 垃圾邮件过滤器 python简单实现
- 下载并遍历 names.txt 文件,输出长度最长的回文人名。
- install and upgrade scrapy
- Scrapy的架构介绍
- Centos6 编译安装Python
- 使用Python生成Excel格式的图片
- 让Python文件也可以当bat文件运行
- [Python]推算数独
- Python中zip()函数用法举例
- Python中map()函数浅析
- Python将excel导入到mysql中
- Python在CAM软件Genesis2000中的应用
- 使用Shiboken为C++和Qt库创建Python绑定
- FREEBASIC 编译可被python调用的dll函数示例
- Python 七步捉虫法