生活中的繼承,一般指的是子女繼承父輩的財產。
拓展1:經典或舊式類
不由任意內置內置型派生出的類,稱之為經典類。
class 類名:
代碼
......
拓展2:新式類
class 類名(object):
代碼
python面向對象的繼承指的是多個類之間的所屬關系,即子類默認繼承父類的所有屬性的方法。
# 繼承:子類默認繼承父類的所有屬性和方法
# 定義父類
from unittest import result
class A(object):
def __init__(self) -> None:
self.num = 1
def info_print(self):
print(self.num)
# 定義子類 繼承父類
class B(A):
pass
# 創建對象,驗證結論
result = B()
result.info_print() # 1
在python中,所有類默認繼承object類,object類是頂級類或基類;其他子類叫做派生類。
故事主線:一個煎餅果子老師傅,在煎餅果子界摸爬滾打多年,研發了一套精湛的攤煎餅果子的技術。師父要把這套技術傳授給他唯一的最得意的徒弟。
分析:徒弟是不是要繼承師父的所有技術?
# 1. 師父類:屬性和方法
class Master():
def __init__(self) -> None:
self.kongfu = '[古法煎餅果子配方]'
def make_cake(self):
print(f'運用{
self.kongfu}制作煎餅果子')
# 2. 定義徒弟類,繼承師父類
class Prentice(Master):
pass
# 3. 用徒弟類創建對象,調用實例屬性和方法
daqiu = Prentice()
print(daqiu.kongfu) # [古法煎餅果子配方]
daqiu.make_cake() # 運用[古法煎餅果子配方]制作煎餅果子
故事推薦:daqiu是個愛學習的好孩子,想要學習共呢個多的煎餅果子技術,於是,報班學習煎餅果子技術。
所謂多繼承意思就是一個類同時繼承了多個父類。
# 1. 定義師父的類
class Master():
def __init__(self) -> None:
self.kongfu = '[古法煎餅果子配方]'
def make_cake(self):
print(f'運用{
self.kongfu}制作煎餅果子')
# 2. 定義培訓學校的類
class School():
def __init__(self) -> None:
self.kongfu = '[溏心蛋果子配方]'
def make_cake(self):
print(f'運用{
self.kongfu}制作煎餅果子')
# 3. 徒弟繼承師父和培訓學校的類
class Prentice(School,Master):
pass
daqiu = Prentice()
print(daqiu.kongfu) # [溏心蛋果子配方]
daqiu.make_cake() # 運用[溏心蛋果子配方]制作煎餅果子
結論:如果一個類繼承多個父類,優先繼承第一個父類的同名屬性和方法
故事:daqiu掌握了師父和培訓的技術後,自己潛心鑽研出自己的獨門配方的一套新的煎餅果子技術。
# 1. 定義師父的類
class Master():
def __init__(self) -> None:
self.kongfu = '[古法煎餅果子配方]'
def make_cake(self):
print(f'運用{
self.kongfu}制作煎餅果子')
# 2. 定義培訓學校的類
class School():
def __init__(self) -> None:
self.kongfu = '[溏心蛋果子配方]'
def make_cake(self):
print(f'運用{
self.kongfu}制作煎餅果子')
# 3. 徒弟獨創配方
class Prentice(School,Master):
def __init__(self) -> None:
self.kongfu = '[獨創煎餅果子配方]'
def make_cake(self):
print(f'運用{
self.kongfu}制作煎餅果子')
daqiu = Prentice()
print(daqiu.kongfu) # [獨創煎餅果子配方]
daqiu.make_cake() # 運用[獨創煎餅果子配方]制作煎餅果子
結論:如果子類和父類擁有同名屬性和方法,子類創建對象調用屬性和方法的時候,調用到的是子類裡面的同名屬性和方法。
得到繼承關系
測試:
print(Prentice.__mro__)
# (<class '__main__.Prentice'>, <class '__main__.School'>, <class '__main__.Master'>, <class 'object'>)
故事:一部分顧客喜歡吃古法煎餅果子,也有一部分喜歡溏心蛋煎餅果子。
# 1. 定義師父的類
class Master():
def __init__(self) -> None:
self.kongfu = '[古法煎餅果子配方]'
def make_cake(self):
print(f'運用{
self.kongfu}制作煎餅果子')
# 2. 定義培訓學校的類
class School():
def __init__(self) -> None:
self.kongfu = '[溏心蛋果子配方]'
def make_cake(self):
print(f'運用{
self.kongfu}制作煎餅果子')
# 3. 徒弟獨創配方
class Prentice(School,Master):
def __init__(self):
self.kongfu = '[獨創煎餅果子配方]'
def make_cake(self):
self.__init__() # 改變初始化後,再次使用自己的,如果沒有調用自己的初始化,會繼續停留在上一個初始化
print(f'運用{
self.kongfu}制作煎餅果子')
def make_master_cake(self):
Master.__init__(self) # 再次調用初始化的原因:這裡想要調用父類同名屬性和方法,屬性在init初始化位置,需要再次調用init
Master.make_cake(self) # 如果不加self會報錯
def make_school_cake(self):
School.__init__(self)
School.make_cake(self)
# 4. 子類調用父類的同名方法
daqiu = Prentice()
daqiu.make_master_cake() # 運用[古法煎餅果子配方]制作煎餅果子
故事:daqiu老了,想要把所有技術傳承給自己的徒弟。
# 1. 定義師父的類
class Master():
def __init__(self) -> None:
self.kongfu = '[古法煎餅果子配方]'
def make_cake(self):
print(f'運用{
self.kongfu}制作煎餅果子')
# 2. 定義培訓學校的類
class School():
def __init__(self) -> None:
self.kongfu = '[溏心蛋果子配方]'
def make_cake(self):
print(f'運用{
self.kongfu}制作煎餅果子')
# 3. 徒弟獨創配方
class Prentice(School,Master):
def __init__(self):
self.kongfu = '[獨創煎餅果子配方]'
def make_cake(self):
self.__init__() # 改變初始化後,再次使用自己的,如果沒有調用自己的初始化,會繼續停留在上一個初始化
print(f'運用{
self.kongfu}制作煎餅果子')
def make_master_cake(self):
Master.__init__(self) # 再次調用初始化的原因:這裡想要調用父類同名屬性和方法,屬性在init初始化位置,需要再次調用init
Master.make_cake(self) # 如果不加self會報錯
def make_school_cake(self):
School.__init__(self)
School.make_cake(self)
# 二代徒弟類
class Tusun(Prentice):
pass
xiaoqiu = Tusun()
xiaoqiu.make_cake() # 運用[獨創煎餅果子配方]制作煎餅果子
xiaoqiu.make_master_cake() # 運用[古法煎餅果子配方]制作煎餅果子
xiaoqiu.make_school_cake() # 運用[溏心蛋果子配方]制作煎餅果子
調用父類的屬性和方法。
上面已經寫過很多了,這裡總結一下:
# 1. 定義師父的類
class Master():
def __init__(self) -> None:
self.kongfu = '[古法煎餅果子配方]'
def make_cake(self):
print(f'運用{
self.kongfu}制作煎餅果子')
# 2. 定義培訓學校的類
class School():
def __init__(self) -> None:
self.kongfu = '[溏心蛋果子配方]'
def make_cake(self):
print(f'運用{
self.kongfu}制作煎餅果子')
# 3. 徒弟獨創配方
class Prentice(School,Master):
def __init__(self):
self.kongfu = '[獨創煎餅果子配方]'
def make_cake(self):
self.__init__()
print(f'運用{
self.kongfu}制作煎餅果子')
def make_master_cake(self):
Master.__init__(self)
Master.make_cake(self)
def make_school_cake(self):
School.__init__(self)
School.make_cake(self)
def make_old_cake(self):
super(Prentice,self).__init__()
super(Prentice,self).make_cake()
daqiu = Prentice()
daqiu.make_old_cake() # 運用[溏心蛋果子配方]制作煎餅果子
這裡的例子比較抽象,如果想深入了解,可以私聊我,很願意解答
在Pyhton中,可以為實例屬性和方法設置私有權限,即設置某個實例屬性或方法不繼承給子類。
故事:daqiu把技術傳承給徒弟的同時,不想把自己的錢(200000000)繼承給徒弟,這個時候就要為
錢
這個實例屬性設置私有權。
設置是由權限的方法:
在屬性名和方法名前加上兩個下劃線。
體驗:
class Prentice():
def __init__(self) -> None:
self.kongfu = '[獨家煎餅果子]'
self.__money = 200000000
def make_cake(self):
print(f'運用{
self.kongfu}制作煎餅果子')
def print_info(self):
print(self.kongfu)
print(self.__money)
class Tusun(Prentice):
pass
daqiu = Prentice()
daqiu.print_info()
''' [獨家煎餅果子] 200000000 '''
xiaoqiu = Tusun()
Tusun.print_info() # 報錯
注意:是由屬性和私有方法只能在類裡面訪問和修改
在python中,一邊定義函數名get_xx
用來獲取是由屬性,定義set_xx
用來修改私有屬性值。
class Prentice():
def __init__(self) -> None:
self.kongfu = '[獨家煎餅果子]'
self.__money = 200000000
def make_cake(self):
print(f'運用{
self.kongfu}制作煎餅果子')
# 調用私有屬性
def print_info(self):
print(self.kongfu)
print(self.__money)
# 獲取私有屬性
def get_money(self):
return self.__money
# 修改私有屬性
def set_money(self,money):
self.__money = money
class Tusun(Prentice):
pass
xiaoqiu = Tusun()
money = xiaoqiu.get_money()
print(xiaoqiu.get_money()) # 200000000
xiaoqiu.set_money(500)
print(xiaoqiu.get_money()) # 500