『無為則無心』Python物件導向 — 55、多層繼承和繼承中的私有成員

繁華似錦Fighting發表於2022-02-25

1、Python支援多層繼承

故事繼續:N年後,徒弟老了,想要把所有技術傳承給自己的徒弟。

(1)多層繼承實現

# 1.建立師父類,屬性和方法
class Master(object):
    def __init__(self):
        self.kongfu = '[古法煎餅果子配方]'

    def make_cake(self):
        print(f'運用{self.kongfu}製作煎餅果子')


# 2.獨創配方
class Prentice(Master):
    def __init__(self):
        self.kongfu = '[獨創煎餅果子配方]'

    def make_cake(self):
        self.__init__()
        print(f'運用{self.kongfu}製作煎餅果子')

    # 古法煎餅
    def make_master_cake(self):
        super().__init__()
        super().make_cake()


# 3.徒孫類繼承徒弟
class Tusun(Prentice):
    pass


# 步驟:
# 建立Tusun物件,
xiaotusun = Tusun()

# 徒孫使用各種做法
xiaotusun.make_cake()
xiaotusun.make_master_cake()

(2)多層繼承和多重繼承區別

image

圖片參考:https://www.cnblogs.com/Through-Target/p/12118310.html

2、繼承中的私有成員

私有成員包括私有成員變數和私有成員方法。

(1)繼承中父類私有屬性和私有方法

子類可以繼承父類中所有的成員,包括私有成員,特殊成員。但是父類中的私有例項屬性和私有例項方法,在子類沒有執行許可權的。

故事繼續:徒弟把技術傳承給徒孫的同時,不想把自己的錢(8000000個億)繼承給徒孫,這個時候就要為這個例項屬性設定私有許可權。

# 1.獨創配方
class Prentice():
    def __init__(self):
        self.kongfu = '[獨創煎餅果子配方]'
        # 定義私有屬性,資產
        self.__money = 8000000

    # 攤煎餅
    def make_cake(self):
        self.__init__()
        print(f'運用{self.kongfu}製作煎餅果子')

    # 定義私有方法
    def __tellMe(self):
        print(self.kongfu)
        print(self.__money)

    def make_cake(self):
        self.__init__()
        print(f'運用{self.kongfu}製作煎餅果子')


# 徒孫類
class Tusun(Prentice):
    pass


xiaoqiu = Tusun()

# 子類物件呼叫父類的共有方法,可以
xiaoqiu.make_cake()

# 子類物件呼叫父類的公有屬性,可以
print(f"煎餅做法流派{xiaoqiu.kongfu}")

# 子類物件呼叫父類的私有屬性
# 不可以報錯:
# AttributeError: 'Tusun' object has no attribute '__money'
# print(f"煎餅做法流派{xiaoqiu.__money}")

# 子類物件呼叫父類的私有方法
# 不可以,報錯
# AttributeError: 'Tusun' object has no attribute '__tellMe'
# xiaoqiu.__tellMe()

"""
# 下面的方式子類可以直接訪問父類的私有成員

注意:
子列物件不能直接訪問父類的私有成員的原理
和類中的私有屬性私有方法的原理是一樣的。
不明白的可以去看前邊的文章,私有成員變數。
"""
print(f"煎餅做法流派{xiaoqiu._Prentice__money}")
xiaoqiu._Prentice__tellMe()

注意:子類可以繼承父類中所有的成員,但是沒有許可權使用父類的私有屬性和私有方法。

(2)獲取和修改私有屬性值

在Python中,一般定義函式名get_xx用來獲取私有屬性,定義set_xx用來修改私有屬性值。

# 1.獨創配方
class Prentice():
    def __init__(self):
        self.kongfu = '[獨創煎餅果子配方]'
        # 定義私有屬性,資產
        self.__money = 8000000

    # 攤煎餅
    def make_cake(self):
        self.__init__()
        print(f'運用{self.kongfu}製作煎餅果子')

    # 定義私有方法
    def __tellMe(self):
        print(self.kongfu)
        print(self.__money)

    def make_cake(self):
        self.__init__()
        print(f'運用{self.kongfu}製作煎餅果子')

    # 獲取私有屬性
    def get_money(self):
        return self.__money

    # 修改私有屬性
    def set_money(self, money):
        self.__money = money


# 徒孫類
class Tusun(Prentice):
    pass


# 建立Tusun物件
xiaoTusun = Tusun()

# 獲取子類物件繼承父類的私有money
print(xiaoTusun.get_money())  # 8000000

# 設定子類物件中,父類的私有屬性
xiaoTusun.set_money(18888)

# 在次檢視
print(xiaoTusun.get_money())  # 18888

# 在建立一個新的Tusun物件
xiaoTusun2 = Tusun()

# 獲取子類物件繼承父類的私有money
# 可以看到結果是# 8000000
# 說明上邊修改的私有屬性是物件中的父類繼承的私有屬性
# 和父類中的私有屬性無關
print(xiaoTusun2.get_money())  # 8000000

總結:

子類可以繼承父類中所有的成員,但是沒有許可權使用父類的私有屬性和私有方法。

但是父類中定義了訪問父類中私有變數的getter()setter()方法,子類也是可以繼承到的。

子類物件中可以通過繼承到的getter()setter()方法,去修改和獲取子類物件中所繼承私有成員變數。

相關文章