python的类属性和实例属性
2013-01-04 21:18
483 查看
在处理项目的代码的时候,发现如下代码在多次调用的时候会出现问题。
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字段来区分出来是否是
类的属性,而解释型的语言的话,因为没有这么多修饰的关键词,所以所有的实例属性都是在使用的时候自动创建的,在类初始化的时候创建的所有属性都是
静态的。
相关文章推荐
- 基于python3 类的属性、方法、封装、继承实例讲解
- Python中的类属性和实例属性以及静态方法和类方法
- Python实例属性和类属性的区别
- Python 类属性,实例属性,类方法,实例方法,静态方法
- Python--类属性和实例属性
- python中初始化实例属性
- Python类的实例属性详解
- Python中父类和子类间类属性(非实例属性)的设置获取的传递
- Python中的类属性和实例属性以及静态方法和类方法
- 关于Python类属性与实例属性的讨论
- python中类属性和实例属性的区别
- 20.python对类的操作(一)——获取对象信息,实例属性和类属性。
- Python中property属性实例解析
- [置顶] Python查缺补漏之一 动态实例属性、引用、转义
- Python——类属性/实例属性
- 第六种方式,python使用cached_property缓存装饰器和自定义cached_class_property装饰器,动态添加类属性(三),selnium webdriver类无限实例化控制成单浏览器。
- Python3学习(23)--__slots__ 限制实例属性的绑定
- Python面向对象—类属性和实例属性
- Python学习26:类属性vs实例属性
- python:小心类实例的属性动态绑定机制