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

python 类变量

2014-08-07 16:16 85 查看
在python的类中,类的属性有两种作用域:类变量,实例变量。
类似于java和c++中的static变量与一般变量的区别。类变量属于整个class所共享,而实例变量则仅仅属于特定对象实例。
类变量和实例变量在操作上的区别

1.
访问权限

类变量通过类名点操作访问也可以通过实例点操作访问className.varobjectName.var

实例变量只可以通过实例名点操作访问objectName.var

2.
类变量修改后的表现

通过className.var修改类变量,该类和所有实例所共享的数据将被修改,再次通过类或实例访问得到的将是新的数据。

通过objectName.var修改类变量,其效果将仅仅作用在该实例上,再次通过类或其它实例访问得到的仍然是旧的数据。但这一修改方式将对该类变量实例化,其结果是该实例将得到一个单独的该变量拷贝,此后此对象不再与类共享该名称的变量(实例化一说,是个人对这一现象的定义,还未找到权威描述)

在类设计中,经常遇到两种类型的变量:类变量和实例变量。

简单的说,类变量(class variable)被该类的所有实例可以共享的变量;如果某个实例修改了该变量,这种变化可以被其他实例看到。

实例变量(object variable, instance variable)属于实例私有;对实例变量的操作不会影响到其他实例对象。

举个简单的例子,就很清楚了。

#!/usr/bin/env python

class Person(object) :

count_beans = 0

def __init__(self, name) :

self.name = name

self.count_beans = 0

def pick(self) :

self.count_beans += 1

Person.count_beans += 1 #self.__class__.count_beans += 1



print '%s pick a bean. He picked %d beans, and we all picked %d beans.' % (self.name, self.count_beans, Person.count_beans)

alex = Person('Alex')

alex.pick()

mike = Person('Mike')

mike.pick()

alex.pick()

jack = Person('Jack')

jack.pick()

alex.pick()

mike.pick()

运行结果:

Alex pick a bean. He picked 1 beans, and we all picked 1 beans.

Mike pick a bean. He picked 1 beans, and we all picked 2 beans.

Alex pick a bean. He picked 2 beans, and we all picked 3 beans.

Jack pick a bean. He picked 1 beans, and we all picked 4 beans.

Alex pick a bean. He picked 3 beans, and we all picked 5 beans.

Mike pick a bean. He picked 2 beans, and we all picked 6 beans.

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: