網站首頁 編程語言 正文
在子類派生的新方法中如何重用父類的功能
方式一:指名道姓調用某一個類下的函數=》不依賴于繼承關系
class OldboyPeople:
def __init__(self,name,age,sex):
self.name=name
self.age=age
self.sex=sex
def f1(self):
print('%s say hello' %self.name)
class Teacher(OldboyPeople):
def __init__(self,name,age,sex,level,salary):
OldboyPeople.__init__(self,name,age,sex)
self.level = level
self.salary=salary
tea_obj=Teacher('egon',18,'male',10,3000)
print(tea_obj.__dict__)
方式二:super()調用父類提供給自己的方法=》嚴格依賴繼承關系
調用super()會得到一個特殊的對象,該對象會參照發起屬性查找的那個類的mro,去當前類的父類中找屬性
提示:在Python2中super的使用需要完整地寫成super(自己的類名,self) ,而在python3中可以簡寫為super()。
class OldboyPeople:
def __init__(self,name,age,sex):
self.name=name
self.age=age
self.sex=sex
def f1(self):
print('%s say hello' %self.name)
class Teacher(OldboyPeople):
def __init__(self,name,age,sex,level,salary):
# super(Teacher,self).__init__(name,age,sex)
super().__init__(name,age,sex) # 調用的是方法,自動傳入對象
self.level = level
self.salary=salary
# print(Teacher.mro())
tea_obj=Teacher('egon',18,'male',10,3000)
print(tea_obj.__dict__)
super()案例
class A:
def test(self):
print('from A')
super().test()
class B:
def test(self):
print('from B')
class C(A,B):
pass
obj=C()
obj.test()
print(C.mro())
這兩種方式的區別是:
方式一是跟繼承沒有關系的,而方式二的super()是依賴于繼承的,并且即使沒有直接繼承關系,super()仍然會按照MRO繼續往后查找
補充 python重寫父類方法
當父類的方法實現不能滿足子類的時候,可以對方法進行重寫
重寫父類的方法有兩種:
- 覆蓋父類方法
- 擴展父類方法
1.覆蓋父類方法
在開發過程中父類實現的方法與子類現完全不同,
可以使用覆蓋的形式,在子類中重新編寫父類的方法
具體的實現形式就是在子類中定義一個與父類同名的方法
重寫父類之后,只會調用子類中重寫后的方法,不會調用
父類中封裝的方法
2)擴展父類方法
如果在開發的過程中,子類的方法實現中,包含父類方法的實現
父類原本封裝的方法實現是子類方法的一部分
使用擴展的方式重寫父類方法:
- 在子類中重寫父類方法
- 在需要的位置使用super.父類方法()來調用方法執行
- 代碼的其它位置針對子類的需求,編寫子類特有的代碼實現
super:
(1)是python中特殊的類
(2)super()就是使用super類創建的對象
(3)常使用在重寫父類方法,調用在父類中封裝的方法實現
'''
重寫方法就是將父類中的方法進行=重新改寫----super()擴展
'''
# 創建一個動物父類
class animal():
? ? def eat(self):
? ? ? ? print('只想吃肉,不想吃飯')
? ? def drink(self):
? ? ? ? print('喝水....')
? ? def sleep(self):
? ? ? ? print('呼呼....')
#創建一個子類--狗類
class Dog(animal):
? ? def call(self,name):
? ? ? ? self.name=name
? ? ? ? print('%s--汪汪....' %self.name)
? ? #重寫睡覺方法
? ? def sleep(self):
? ? ? ? #1.針對子類特有的需求
? ? ? ? print('神犬睡覺')
? ? ? ? #2.使用super().調用父類中原有的方法
? ? ? ? super().sleep()
? ? ? ? #3. 增加其它子類的代碼
? ? ? ? print('$%%&*###')
#創建狗類對象
dog=Dog()
dog.call('哮天犬')
#調用睡覺方法--------此時發現睡覺方法已經被改寫了,不在是‘呼呼....'了
dog.sleep()
原文鏈接:https://www.cnblogs.com/python1111/p/16724164.html
相關推薦
- 2022-09-06 Minio設置文件鏈接永久有效的完整步驟_其它綜合
- 2023-03-23 python實現簡易連點器_python
- 2021-12-20 Win10配置Hadoop環境變量
- 2022-05-09 Python實現連接FTP并下載文件夾_python
- 2022-07-30 react中受控組件與非受控組件
- 2022-01-22 Redis學習之旅--與SpringBoot的結合
- 2022-03-09 C++使用map實現多進程拷貝文件的程序思路_C 語言
- 2022-12-06 Python基礎面向對象之繼承與派生詳解_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支