一恭理、繼承的概念
Python面向?qū)ο蟮睦^承指的是多個類之間的所屬關(guān)系聚至,即子類默認(rèn)繼承父類的屬性和方法
# 父類A
class A(object):
def __init__(self):
self.num = 1
def info_print(self):
print(self.num)
# 子類B
class B(A):
pass
# 創(chuàng)建對象庐扫,驗(yàn)證結(jié)論
result = B()
result.info_print() # 1
在Python中,所有類默認(rèn)繼承object類,object類是頂級類或基類;其他子類叫做派生類
二炼杖、單繼承
- 逍遙派掌門人無崖子決定在離世之前將一身絕學(xué)傳給虛竹
- 分析:徒弟是不是要繼承師父的所有武功?
# 1. 師父類
class Master(object):
def __init__(self):
self.kongfu = '[北冥神功]'
def beiming(self):
print(f'虛竹運(yùn)用{self.kongfu}擊敗敵人')
# 2. 徒弟類
class Prentice(Master):
pass #
3. 創(chuàng)建對象
xuzhu xuzhu = Prentice()
# 4. 對象訪問實(shí)例屬性
print(xuzhu.kongfu)
# 5. 對象調(diào)用實(shí)例方法
xuzhu.beiming() # 虛竹運(yùn)用[北冥神功]擊敗敵人
三碟渺、多繼承
所謂多繼承意思就是一個類同時(shí)繼承了多個父類
- 虛竹在繼承無崖子功力之前叔扼,曾是少林寺僧人览徒,會些許少林武功
class XiaoYao(object):
def __init__(self):
self.wugong = '[北冥神功]'
def kongfu(self):
print(f'運(yùn)用{self.wugong}擊敗敵人')
# 少林武功
class ShaoLin(object):
def __init__(self):
self.wugong = '[波若掌]'
def kongfu(self):
print(f'運(yùn)用{self.wugong}擊敗敵人')
class Prentice(ShaoLin, XiaoYao):
pass
xuzhu = Prentice()
print(xuzhu.wugong)
xuzhu.kongfu() # 運(yùn)用[波若掌]擊敗敵人
注意:當(dāng)一個類有多個父類的時(shí)候狈定,默認(rèn)使用第一個父類的同名屬性和方法。
四习蓬、子類重寫父類同名方法和屬性
- 虛竹潛心修煉自創(chuàng)逍遙游
子類和父類具有同名屬性和方法纽什,默認(rèn)使用子類的同名屬性和方法。class XiaoYao(object): def __init__(self): self.wugong = '[北冥神功]' def kongfu(self): print(f'運(yùn)用{self.wugong}擊敗敵人') # 少林武功 class ShaoLin(object): def __init__(self): self.wugong = '[波若掌]' def kongfu(self): print(f'運(yùn)用{self.wugong}擊敗敵人') class Prentice(ShaoLin, XiaoYao): def __init__(self): self.wugong = '[逍遙游]' def kongfu(self): print(f'運(yùn)用{self.wugong}擊敗敵人') xuzhu = Prentice() print(xuzhu.wugong) xuzhu.kongfu() # 運(yùn)用[逍遙游]擊敗敵人 print(Prentice.__mro__) # 查看一個類繼承的父類以及層級關(guān)系
五躲叼、子類調(diào)用父類的同名方法和屬性
- 喬峰想要領(lǐng)教一下三弟虛竹的武功芦缰,于是虛竹使出了渾身解數(shù)
# 逍遙派武功 class XiaoYao(object): def __init__(self): self.wugong = '[北冥神功]' def kongfu(self): print(f'運(yùn)用{self.wugong}擊敗敵人') # 少林武功 class ShaoLin(object): def __init__(self): self.wugong = '[波若掌]' def kongfu(self): print(f'運(yùn)用{self.wugong}擊敗敵人') class Prentice(ShaoLin, XiaoYao): def __init__(self): self.wugong = '[逍遙游]' def kongfu(self): self.__init__() print(f'運(yùn)用{self.wugong}擊敗敵人') def xiaoyao_kongfu(self): XiaoYao.__init__(self) XiaoYao.kongfu(self) def shaolin_kongfu(self): ShaoLin.__init__(self) ShaoLin.kongfu(self) xuzhu = Prentice() # print(xuzhu.wugong) # xuzhu.kongfu() xuzhu.xiaoyao_kongfu() xuzhu.shaolin_kongfu() xuzhu.kongfu()
六、多層繼承
- 多年后虛竹想要將武功再傳下去枫慷,挑選了一位徒弟
class XiaoYao(object): def __init__(self): self.wugong = '[北冥神功]' def kongfu(self): print(f'運(yùn)用{self.wugong}擊敗敵人') class ShaoLin(object): def __init__(self): self.wugong = '[波若掌]' def kongfu(self): print(f'運(yùn)用{self.wugong}擊敗敵人') class Prentice(ShaoLin, XiaoYao): def __init__(self): self.wugong = '[逍遙游]' def kongfu(self): self.__init__() print(f'運(yùn)用{self.wugong}擊敗敵人') def xiaoyao_kongfu(self): XiaoYao.__init__(self) XiaoYao.kongfu(self) def shaolin_kongfu(self): ShaoLin.__init__(self) ShaoLin.kongfu(self) class TuDi(Prentice): pass tudi = TuDi() tudi.kongfu() tudi.shaolin_kongfu() tudi.xiaoyao_kongfu()
七让蕾、super()調(diào)用父類方法
# 逍遙派武功
class XiaoYao(object):
def __init__(self):
self.wugong = '[北冥神功]'
def kongfu(self):
print(f'運(yùn)用{self.wugong}擊敗敵人')
# 少林武功
class ShaoLin(XiaoYao):
def __init__(self):
self.wugong = '[波若掌]'
def kongfu(self):
print(f'運(yùn)用{self.wugong}擊敗敵人')
# super()
# 2.1 帶參數(shù)
# super(ShaoLin,self).__init__()
# super(ShaoLin,self).kongfu()
#2.2 無參數(shù)
super().__init__()
super().kongfu()
class Prentice(ShaoLin):
def __init__(self):
self.wugong = '[逍遙游]'
def kongfu(self):
self.__init__()
print(f'運(yùn)用{self.wugong}擊敗敵人')
def xiaoyao_kongfu(self):
XiaoYao.__init__(self)
XiaoYao.kongfu(self)
def shaolin_kongfu(self):
ShaoLin.__init__(self)
ShaoLin.kongfu(self)
# 一次性調(diào)用兩個父類的方法
def two_kongfu(self):
# 方法一:如果類型修改,這里代碼也要修改或听,而且如果代碼量龐大探孝,會很麻煩,幾乎都是冗余的 代碼
# XiaoYao.__init__(self)
# XiaoYao.kongfu(self)
# ShaoLin.__init__(self)
# ShaoLin.kongfu(self)
# 方法二:super()
# 2.1誉裆、super(當(dāng)前類名,self).函數(shù)()
# super(Prentice,self).__init__()
# super(Prentice,self).kongfu()
# 2.2顿颅、super() 無參數(shù)
super().__init__()
super().kongfu()
xuzhu = Prentice()
xuzhu.two_kongfu()
另外,子類的對象屬性不能超過其各個父類屬性個數(shù)的最大值足丢,如果不同父類有不同的屬性定義元镀,子類
需要全部繼承時(shí),需要使用args霎桅,*kwargs不定長參數(shù)使父類的屬性個數(shù)不定長,此時(shí)子類繼承時(shí)能
獲得所有的屬性讨永。
class XiaoYao(object):
def __init__(self,*args,**kwargs):
self.wugong = '[北冥神功]'
self.music = '[達(dá)拉崩吧]'
super().__init__(*args,**kwargs)
def kongfu(self):
print(f'運(yùn)用{self.wugong}擊敗敵人')
# 少林武功
class ShaoLin(object):
def __init__(self,*args,**kwargs):
self.wugong = '[波若掌]'
super().__init__(*args,**kwargs)
def kongfu(self):
print(f'運(yùn)用{self.wugong}擊敗敵人')
class Prentice(ShaoLin, XiaoYao):
def __init__(self):
super().__init__()
xuzhu = Prentice()
print(xuzhu.wugong)
print(xuzhu.music)
八滔驶、私有權(quán)限
8.1 定義私有屬性和私有方法
在Python中,可以為實(shí)例屬性和方法設(shè)置私有權(quán)限卿闹,即設(shè)置某個實(shí)例屬性或?qū)嵗椒ú焕^承給子類揭糕。
設(shè)置私有權(quán)限的方法:在屬性名和方法名 前面 加上兩個下劃線 __萝快。
- 虛竹臨終前,不想把自己的錢給徒弟
注意:稀有屬性和私有方法只能在類里面訪問和修改class XiaoYao(object): def __init__(self): self.wugong = '[北冥神功]' def kongfu(self): print(f'運(yùn)用{self.wugong}擊敗敵人') class ShaoLin(object): def __init__(self): self.wugong = '[波若掌]' def kongfu(self): print(f'運(yùn)用{self.wugong}擊敗敵人') class Prentice(ShaoLin, XiaoYao): def __init__(self): self.wugong = '[逍遙游]' self.__money = 200000 def kongfu(self): self.__init__() print(f'運(yùn)用{self.wugong}擊敗敵人') def __info_print(self): print("私有方法") class TuDi(Prentice): pass tudi = TuDi() print(tudi.__money) # 報(bào)錯 tudi.__info_print() # 報(bào)錯
8.2 獲取和修改私有屬性值
class XiaoYao(object):
def __init__(self):
self.wugong = '[北冥神功]'
def kongfu(self):
print(f'運(yùn)用{self.wugong}擊敗敵人')
class ShaoLin(object):
def __init__(self):
self.wugong = '[波若掌]'
def kongfu(self):
print(f'運(yùn)用{self.wugong}擊敗敵人')
class Prentice(ShaoLin, XiaoYao):
def __init__(self):
self.wugong = '[逍遙游]'
self.__money = 200000
def kongfu(self):
self.__init__()
print(f'運(yùn)用{self.wugong}擊敗敵人')
# 獲取私有屬性
def get_money(self):
return self.__money
# 修改私有屬性
def set_money(self):
self.__money = 500
def __info_print(self):
print('私有方法')
class TuDi(Prentice):
pass
tudi = TuDi()
print(tudi.get_money())
tudi.set_money()
print(tudi.get_money())