您的位置:首页 > 编程语言 > Python开发

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


至此,关于类变量、实例变量的相关内容已经完成。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息