iT邦幫忙

2023 iThome 鐵人賽

DAY 21
0
Software Development

Python 微進階系列 第 21

Python 微進階 Day21 - class(類別) - 5 - inheritance

  • 分享至 

  • xImage
  •  

class(類別)

inheritance(繼承)

  • inheritance(繼承):類別透過繼承來取得另一個類別所使用的屬性或方法,這樣可降低重複性
  • B 類別繼承自 A 類別
    • B 類別為 A 類別的子類別 (child)
    • A 類別為 B 類別的父類別 (parent)
  • 一般會將共同使用的屬性或方法放在一個類別,再讓其他的類別去繼承它
    • 語法:class Child(Parent)
  • method overriding(方法覆寫)
    • 未定義時,子類別可以使用父類別的相關方法
    • 假如子類別定義了和父類別同名的 method,則會覆蓋掉父類別的同名 method
    • 假如想在子類別中執行父類別的方法時,則使用 super().method()
    • 因此若當子類別的初始化方法(__init__)有所變動(跟父類不同),則需要使用 super().__init__()父類別.__init__() 來引用父類別的 __init__
  • 子類別可直接讀取父類別的類別變數
class M():
    z = "Z"
    def __init__(self):
        self.m = "M"

class C(M):
    pass

class D(M):
    def __init__(self):
        # D 自己的 __init__
        # 沒有 self.m
        self.d = "D"

class E(M):
    def __init__(self):
        super().__init__()
        # M.__init__()
        # 引用父類別 M 的 __init__
        # 有 self.m
        self.e = "E"

c = C()
d = D()
e = E()

print(c.m)
# M

print(d.d)
# D
print(d.m)
# 'D' object has no attribute 'm'
# 跳錯,並無 M() 內的 m

print(e.m)
# M
# 有引入 M() 內的 m
print(e.e)
# E

# 類別變數
print(c.z, d.z, e.z)
# Z Z Z
# 繼承至 M

C.z = "C class"
# 新建類別變數 z
print(c.z, C.z)
# C class C class

c.z = "C obj"
# 新建物件變數 z
print(c.z, C.z)
# C obj C class

multiple inheritance(多重繼承)

  • 當繼承超過一個,如 C 類別繼承 A 類別,又繼承 B 類別,如 class C(B, A)
  • 假設沒有覆寫的狀態下,C 類別是可以使用 A 和 B 類別的方法與變數的
  • 搜尋順序
    • 當有相同變數或方法時,則以繼承的順序(由左至右)為主
    • 若尋找的類別如 B 本身又有父類別,則會先搜尋 B 的父類別,才會再去找 A 類別
class A():
    val = "is a"
    def print_val(self):
        print("A")

class B():
    def print_val(self):
        print("B")


class C(B, A):
    pass

c = C()
c.print_val()
# B
print(c.val)
# is a

multi-level inheritance(多層繼承)

  • 當繼承超過一層,如 C 類別繼承自 B 類別,B 類別又繼承自 A 類別
  • 假設沒有覆寫的狀態下,C 類別是可以使用 A 類別的方法與變數的
  • 因此在使用上需注意邏輯上是否有衝突,建議不要超過 2 層,以免增加複雜度
class A():
    def print_a(self):
        print("A")

class B(A):
    b = "b"
    pass

class C(B):
    pass

c = C()
c.print_a()
# A
print(c.b)
# b

參考資料

次回

類別竟然還有一些內容沒提到!明天繼續


上一篇
Python 微進階 Day20 - class(類別) - 4 - @property
下一篇
Python 微進階 Day22 - class(類別) - 6 - @abstractmethod、polymorphism
系列文
Python 微進階31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言