Re: [问题] 类别中使用List的问题

楼主: nevak (^o^)   2019-11-20 09:50:07
※ 引述《jijuan ()》之铭言:
: class Point:
: x = 0
: y = 0
: pos = [0, 0]
: def __init__(self, x, y):
: self.x = x
: self.y = y
: self.pos[0] = x
: self.pos[1] = y
: def show_xy(self):
: print(self.x, self.y, self.pos[0], self.pos[1])
: p1 = Point(1, 2)
: p2 = Point(3, 4)
: p1.show_xy()
: p2.show_xy()
: 输出结果是
: 1 2 3 4
: 3 4 3 4
: 虽然p1、p2是两个不同的实体
: 所以不是各自都有一份属于自己的x、y和pos吗
: 可是p1中的pos却是建立p2时赋予的值
: 但xy却又没变
: 请问这是什么原因
: 如果需求是希望每个一实体都有一份自己独立的pos时
: 该如何做呢?
简单来说:
你如果需要每一个实体都有自己的x, y, pos,不需要在class里先assign x, y, pos
直接在__init__()里assign self.x, self.y, self.pos就可以了
复杂一点说明如下:
首先你在前面写的
class Point:
x = 0
y = 0
pos = [0, 0]
...
这些是class variable,每一个instance看到的都会是同样的variables
比方说在def __init__(self, ...) 里读取self.x, self.y, self.pos
每一个instance都会读取到相同的variables
但是,instance variable可以override class variable
也就是说,当instance variable跟class variable同名的时候
self.var会存取到instance variable
而建立intance variable的方法,其实就是对他做一个assigment
show_xy()中的self.x, self.y,实际上是在__init__中建立的instance variable
因此每一个instance会不同
至于pos,由于在__init__中的assignment是针对pos[0], pos[1]
也就是针对pos variable所指向的list object中的内容作更改
所以这个assignment必须先有一个可以透过self.pos取得的pos variable
可以是instance variable也可以是class variable
而在你的code中,由于instance并没有建立pos instance variable
因此每一个intance中的self.pos一直都是同一个class variable
以下几个code你可以试试看,做完也许会比较清楚:
1.
在你原本的code最后加上
print(Point.x, Point.y, Point.pos[0], Point.pos[1])
可以列出class variable的x, y, pos
你会发现class variable x, y一直都是0,从来都没变
2.
如同前面几个回文
若要每个instance有自己的pos,必须在__init__中建立self.pos
方法是assign一个list给self.pos
也就是self.pos = [x, y]
3.
如果instance variable已经override class variable
怎么在instance method中存取class variable?
可以透过type(self)来取得class object,透过class object即可以存取class var
比方说
class Point:
x = 0
def __init__(self):
self.x = 1 # override Point.x
print(self.x) # print 1 , instance var
print(type(self).x) # print 0 , class var
4.
有兴趣也可以google: python object attributes
作者: jijuan   2019-11-21 08:15:00
非常感谢您详细的回答
作者: Ryspon (Ry)   2019-11-21 11:29:00
推这篇
作者: lienielsen (good job)   2019-11-22 13:03:00
感谢这解我的疑惑

Links booklink

Contact Us: admin [ a t ] ucptt.com