程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

python-面向對象-繼承

編輯:Python

文章目錄

  • 繼承的概念
  • 拓展經典類和新式類
  • 單繼承
  • 多繼承
  • 子類重寫父類同名方法和屬性
  • 拓展_mro順序
  • 子類調用父類的同名方法和屬性
  • 多層繼承
  • super()方法作用
    • 父類.方法調用 VS super()方法
      • 父類.方法
      • super()方法
  • 私有權限
    • 定義所有屬性和方法
    • 獲取和修改私有屬性值

繼承的概念

生活中的繼承,一般指的是子女繼承父輩的財產。

拓展經典類和新式類

拓展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() # 運用[獨創煎餅果子配方]制作煎餅果子

結論:如果子類和父類擁有同名屬性和方法,子類創建對象調用屬性和方法的時候,調用到的是子類裡面的同名屬性和方法。

拓展_mro順序

得到繼承關系
測試:


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() # 運用[溏心蛋果子配方]制作煎餅果子

super()方法作用

調用父類的屬性和方法。

父類.方法調用 VS super()方法

父類.方法

上面已經寫過很多了,這裡總結一下:

  1. 如果前面的類名修改,後面子類使用父類裡面也要修改。
  2. 代碼量龐大,比較冗余

super()方法

# 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

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved