在处理项目的代码的时候,发现如下代码在多次调用的时候会出现问题。
class test1(object):
_dataArr=[]
def __init__(self,i):
self._dataArr.append(i)
def run(self):
print self._dataArr
t1=test1(1)
t2=test1(2)
t1.run()
t2.run()
输出的结果照常理的话,应该是
[1]
[2]
结果却是:
[1, 2]
[1, 2]
说明构造test类两次,两次用的_dataArr是同一个,所以_dataArr应该是一个类级别的属性,这样才能让两个实例进行调用,而且用的又是同一个内容。
如果将_dataArr变量变成动态的。
class test2(object):
def __init__(self,i):
self._dataArr=[]
self._dataArr.append(i)
def run(self):
print self._dataArr
def case2():
t1=test2(1)
t2=test2(2)
t1.run()
t2.run()
case2()
那么输出的结果就是正确的。
[1]
[2]
为此合理的解释,就是编译型的语言和解释型的语言有很大的不一样,尤其在处理类这个东西的时侯,编译型的语句可以通过static字段来区分出来是否是
类的属性,而解释型的语言的话,因为没有这么多修饰的关键词,所以所有的实例属性都是在使用的时候自动创建的,在类初始化的时候创建的所有属性都是
静态的。
class test1(object):
_dataArr=[]
def __init__(self,i):
self._dataArr.append(i)
def run(self):
print self._dataArr
t1=test1(1)
t2=test1(2)
t1.run()
t2.run()
输出的结果照常理的话,应该是
[1]
[2]
结果却是:
[1, 2]
[1, 2]
说明构造test类两次,两次用的_dataArr是同一个,所以_dataArr应该是一个类级别的属性,这样才能让两个实例进行调用,而且用的又是同一个内容。
如果将_dataArr变量变成动态的。
class test2(object):
def __init__(self,i):
self._dataArr=[]
self._dataArr.append(i)
def run(self):
print self._dataArr
def case2():
t1=test2(1)
t2=test2(2)
t1.run()
t2.run()
case2()
那么输出的结果就是正确的。
[1]
[2]
为此合理的解释,就是编译型的语言和解释型的语言有很大的不一样,尤其在处理类这个东西的时侯,编译型的语句可以通过static字段来区分出来是否是
类的属性,而解释型的语言的话,因为没有这么多修饰的关键词,所以所有的实例属性都是在使用的时候自动创建的,在类初始化的时候创建的所有属性都是
静态的。