99热99这里只有精品6国产,亚洲中文字幕在线天天更新,在线观看亚洲精品国产福利片 ,久久久久综合网

歡迎加入QQ討論群258996829
麥子學院 頭像
蘋果6袋
6
麥子學院

python類變量和成員變量的使用注意點

發(fā)布時間:2017-07-21 18:42  回復:0  查看:2996   最后回復:2017-07-21 18:42  

之前在用python開發(fā)一個項目,發(fā)現一個bug,就是同由一個類生成的兩個實例之間的數據竟然會相互影響,這讓我非常不解。后來聯想到java的類有類變量也有實例變量,因此翻閱了相關資料,發(fā)現python也有類似的類變量和實例變量,比如下面的代碼中:

  class A:

  x = 0

  def __init__(self):

  self.y = 0

  x就是類變量,y就是實例變量。

  原則上是沒有錯的,但是實際用的時候就發(fā)現一些惡心的問題(也就是我找了三天的bug)。。。比如下面的代碼:

  class A:

  x = []

  y = 0

  def __init__(self):

  pass

  def add(self):

  self.x.append('1')

  self.y+=1

  a=A() print a.x,a.yprint A.x,A.y

  a.add()print a.x,a.yprint A.x,A.y

  b=A() print b.x,b.yprint A.x,A.y

  這里很明顯xy都是類變量,add的作用是分別對xy做出修改。然后構造一個實例a,對實例a的值進行修改,最后構造實例b。

  本以為這個結果是顯而易見的,然而他輸出的結果卻是:

  [] 0

  [] 0

  ['1'] 1

  ['1'] 0

  ['1'] 0

  ['1'] 0

  問題在哪?明明xy都是類變量,在第二組print中為什么a.xb.x一樣,但是a.yb.y就是不一樣呢?

  想了半天悟了一個道理。。。就是對于python來說,類變量的確是所有類共有的東西。但是那是在我們用的同一個引用的情況下,比如對于[]對象的append方法就是公用一個類變量了;但是對于賦值語句來說,如果在類中對類變量使用了賦值語句,那么python就會生成一個該對象的副本,以后的操作都是基于這個副本而不會對原來的類對象造成影響。這樣就解釋的通上面的現象了。

  那么為了杜絕自己忘記類變量和實例變量的區(qū)別導致本不想公用變量的時候公用了變量,最好的辦法就是在每個類中使用變量的時候重新初始化一下,這樣就不會導致意外了

 

 

來源:Myths的個人博客

您還未登錄,請先登錄

熱門帖子

最新帖子

?