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