|
发表于 2019-7-17 17:57:56
|
显示全部楼层
本帖最后由 fallout.nj 于 2019-7-17 22:39 编辑
老哥,其实实例化对象很简单,我之前也纠结了很久,现在用你的代码做例子说说我的理解
- class Point():
- x = 1
- y = 2
- def __init__(self, x=3, y=4):
- self.x = x
- self.y = y
- # points = [point]*6
- points = []
- for i in range(6):
- points.append(Point())
- points[0].x = 12
- print(points[1].x)
- print(points[2].x)
- print(points[3].x)
复制代码
发现问题了吗?其实Point带上括号就是实例化,上面这段代码只是单纯的将Point()放入points例表里6次,但是这列表里的每个元素的地址都不一样的,也就是他们都实例化了!
例如我之前给你的回复的代码意思是说每个实例化都给了个名字,a0,a1,a2...a5,然后再把a0-a5放到列表里而已P
那问题来了,如果将这个代码
- for i in range(6):
- points.append(Point())
复制代码
变成下面这个代码
- for i in range(6):
- points.append(Point)
复制代码
那结果会怎样?
很显然,结果就都会变成12了,而且你会发现,points列表里的每个元素都指向同一个内存地址!这就是没有实例化!调用没有实例化的类的属性,例如Point.x 它的值就是1
举个例子,上面的代码里,如果没有这句的时候,points[0].x的值会等于1,那是因为class内,函数外面的变量都是类的内部变量,在实例化以后x和y就没用了(或者也可以说x和y是你封装在Point类内的常量)!
不知道你能理解不,当时我也是因为类内变量的作用域而苦恼不已。 |
|