Python入門基礎篇 No.83 —— 物件的淺拷貝和深拷貝_組合
阿新 • • 發佈:2021-01-20
技術標籤:# 基礎python程式語言windows經驗分享程式人生
Python入門基礎篇 No.83 —— 物件的淺拷貝和深拷貝_組合
文章目錄
前生篇:特殊方法和運算子過載_特殊屬性
前言
一、物件的淺拷貝和深拷貝
- 變數的賦值操作
只是形成兩個變數,實際還是指向同一個物件。
- 淺拷貝
Python 拷貝一般都是淺拷貝。拷貝時,物件包含的子物件內容不拷貝。因此,源物件和拷貝物件會引用同一個子物件。
- 深拷貝
使用 copy 模組的 deepcopy 函式,遞迴拷貝物件中包含的子物件。源物件和拷貝物件所有的子物件也不同。
程式碼演示:
# 測試物件的引用賦值、淺拷貝、深拷貝
import copy
class MobilePhone:
def __init__(self, cpu, screen):
self.cpu = cpu
self.screen = screen
class CPU:
def calculate(self):
print("計算,12345")
print("CPU物件:", self)
class Screen:
def show(self):
print("顯示一個好看的畫面")
print("螢幕物件:", self)
c = CPU()
s = Screen()
m = MobilePhone(c, s)
m.cpu.calculate()
n = m # 兩個變數,但是指向了同一個物件
print(m, n)
m2 = copy.copy(m) # m2是新拷貝的另一個手機物件
print(m, m2)
m.cpu.calculate()
m2.cpu.calculate() # m2和m擁有了一樣的cpu物件和screen物件
m3 = copy.deepcopy(m)
m3.cpu.calculate() # m3和m擁有不一樣的cpu物件和screen物件
----------------------------------------
計算,12345
CPU物件: <__main__.CPU object at 0x00000218FBB1F850>
<__main__.MobilePhone object at 0x0000021894924EB0> <__main__.MobilePhone object at 0x0000021894924EB0>
<__main__.MobilePhone object at 0x0000021894924EB0> <__main__.MobilePhone object at 0x00000218FB9B6670>
計算,12345
CPU物件: <__main__.CPU object at 0x00000218FBB1F850>
計算,12345
CPU物件: <__main__.CPU object at 0x00000218FBB1F850>
計算,12345
CPU物件: <__main__.CPU object at 0x0000021894AC3820>
二、組合
- “is-a”關係,我們可以使用“繼承”。從而實現子類擁有的父類的方法和屬性。“is-a”關係指的是類似這樣的關係:狗是動物,dog is animal。狗類就應該繼承動物類。
- “has-a”關係,我們可以使用“組合”,也能實現一個類擁有另一個類的方法和屬性。”has-a”關係指的是這樣的關係:手機擁有 CPU。 MobilePhone has a CPU。
程式碼演示:
# 測試物件的引用賦值、淺拷貝、深拷貝
class MobilePhone:
def __init__(self, cpu, screen):
self.cpu = cpu
self.screen = screen
class CPU:
def calculate(self):
print("計算,12345")
class Screen:
def show(self):
print("顯示一個好看的畫面")
c = CPU()
s = Screen()
m = MobilePhone(c, s)
m.cpu.calculate() # 通過組合,我們也能呼叫cpu物件的方法。相當於手機物件簡介擁有了“cpu”方法
m.screen.show()
--------------------------
計算,12345
顯示一個好看的畫面
總結
以上幫各位總結好了,收藏,關注即可查收。
前生篇:特殊方法和運算子過載_特殊屬性
關注下方公眾號,免費拿Python學習資料!!!