中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

python3中構造函數和析構函數的區別

發布時間:2021-05-14 16:26:13 來源:億速云 閱讀:260 作者:Leah 欄目:開發技術

這篇文章將為大家詳細講解有關python3中構造函數和析構函數的區別,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。

要點:

1、魔法方法,被__雙下劃線所包圍

在適當的時候自動被調用

2、在創建一個對象的時候,一定會調用構造函數

3、 del析構函數,在del a對象的時候,并一定會調用該析構函數

只有當該對象的引用計數為0時才會調用析構函數,回收資源

析構函數被python的垃圾回收器銷毀的時候調用。當某一個對象沒有被引用時,垃圾回收器自動回收資源,調用析構函數

#coding=utf-8
'''
魔法方法,被__雙下劃線所包圍
在適當的時候自動被調用
'''
#構造init、析構del
class Rectangle:
  def __init__(self,x,y):
    self.x = x
    self.y = y
    print('構造')
  '''
  del析構函數,并不是在del a對象的時候就會調用該析構函數
  只有當該對象的引用計數為0時才會調用析構函數,回收資源
  析構函數被python的垃圾回收器銷毀的時候調用。當某一個對象沒有被引用時,垃圾回收器自動回收資源,調用析構函數
  '''
  def __del__(self):
    print('析構')
  def getPeri(self):
    return (self.x + self.y)*2
  def getArea(self):
    return self.x * self.y
if __name__ == '__main__':
  rect = Rectangle(3,4)
  # a = rect.getArea()
  # b = rect.getPeri()
  # print(a,b)
  rect1 = rect
  del rect1
  # del rect
  while 1:
    pass

補充知識:Python 類成員變量使用缺省值初始化時要注意的一個坑

Python 類成員變量使用缺省值初始化時要注意的一個坑

標簽(空格分隔): python2.7 python 3.6

考慮到如下場景:

定義class A,class A 包含成員變量 l 和 d, l為數組, d 為字典;

在 class A 的構造函數中使用缺省參數初始化 A 的成員變量 l 和 d ;

具體代碼如下:

class A:
  def __init__(self, l=["name"], d={"key1": "test"}):
    self.l = l
    self.d = d

現在,在主邏輯函數中定義生成多個 A 的實例, 構造時使用構造函數的缺省值:

if __name__ == "__main__":
  a1 = A()
  a2 = A()
  print (id(a1.l), id(a1.d))
  print (id(a2.l), id(a2.d))

輸出的結果如下:

python2.7 
(56305416L, 56376040L) 
(56305416L, 56376040L)

python3.6 
 2036953558112 
 2036953558112

可以看出,使用缺省值初始化的2個 A 的實例中,對應的成員變量 l 和 d 指向了同一個地址

現在假設需要在主邏輯函數中分別操作實例a1 和 a2:

if __name__ == "__main__":
  a1 = A()
  a2 = A()
  # print (id(a1.l), id(a1.d))
  # print (id(a2.l), id(a2.d))

  a1.l.extend(["a", "b", "C", "Xa"])
  a1.d["key"] = "value"

  print ("a1", a1.l, a1.d)
  print ("a2", a2.l, a2.d)

輸出結果會如下:

a1 ['name', 'a', 'b', 'C', 'Xa'] {'key1': 'test', 'key': 'value'}
a2 ['name', 'a', 'b', 'C', 'Xa'] {'key1': 'test', 'key': 'value'}

只修改a1,但 a2 的成員變量同時也被改變了!

此問題實際場景中其中一個是在使用wxGride時會遇到:

class MyGrid(wx.grid.Grid):
  def __init__(self, parent, col_titles=["a", "b", "c"], data=[["1", "2", "3"]]):
    wx.grid.Grid__init__(self, parent=parent)
    self.col_titls = col_titles
    self.data = data
    ...

  def AppendData(self, rows=[], clear=Flase):
    self.data.extend(rows)
    msg = wx.grid.GridTableMessage(self,
                    wx.grid.GRIDTABLE_NOTIFY_ROWS_DELETED,
                    0,
                    len(rows))
    self.ProcessTableMessage(msg)

class MyFrame(wx.Frame):
  def __init(self, parent, title=""):
    wx.Frame.__init__(self, parent=parent, title=title)
    self.grid1 = MyGrid(self)
    self.grid2 = MyGrid(self)
    ...

  def onGridAddCallback(rows, force=False):
    if isinstance(rows, list) and len(rows) > 0:
      self.grid1.AppendData(rows, force)

當更新gird1的內容時,gird2的成員變量 data 也發生了改變,因此導致異常

可選的解決方案: 避免使用缺省值初始化指針類型成員變量(list, dict …):

class MyFrame(wx.Frame):
  def __init(self, parent, title=""):
    wx.Frame.__init__(self, parent=parent, title=title)
    self.grid1 = MyGrid(self, col_titles=["a", "b", "c"], data=[["1", "2", "3"]])
    self.grid2 = MyGrid(self, col_titles=["a", "b", "c"], data=[["1", "2", "3"]])
    ...

關于python3中構造函數和析構函數的區別就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

安福县| 北流市| 苏尼特右旗| 板桥市| 奉化市| 灌云县| 台江县| 连平县| 长白| 库车县| 安康市| 沅陵县| 郯城县| 库伦旗| 普定县| 延寿县| 西华县| 宜章县| 凤城市| 永福县| 昔阳县| 翼城县| 武城县| 许昌县| 新乡市| 绥滨县| 冷水江市| 岗巴县| 康乐县| 娱乐| 探索| 江安县| 枝江市| 贵溪市| 定远县| 锡林郭勒盟| 苏尼特左旗| 冀州市| 宁明县| 邳州市| 麻江县|