前言
前面我們已經學習了 python 面向對象的類和對象,那么今天我將為大家分享面向對象的三大特性之一:繼承。
繼承具有以下特性:
-
代碼重用:繼承允許我們創(chuàng)建一個新的類,并從一個或多個現有的類中繼承屬性和方法。這使得我們可以避免重復編寫相同的代碼,提高代碼的重用性。通過繼承,我們可以在基類的基礎上構建更特定和具體的子類。
-
擴展功能:通過繼承,我們可以在基類的基礎上添加新的屬性和方法,以實現對基類功能的擴展。這樣,我們可以在不修改基類代碼的情況下,通過子類來定制或擴展特定的行為。這種靈活性使得我們能夠輕松地適應不斷變化的需求。
-
組織和抽象概念:通過繼承,我們可以組織類之間的關系,并以更抽象的方式來表達概念和邏輯。通過將共同的屬性和方法放在基類中,我們可以更清晰地表達類之間的關系和層次結構。這種抽象化的設計能夠提高代碼的可讀性和可維護性。
-
實現多態(tài)性:繼承也為實現多態(tài)性(Polymorphism)提供了基礎。多態(tài)性是面向對象編程中非常重要的概念,它可以讓我們使用統(tǒng)一的方式處理不同的對象類型。通過繼承,我們可以創(chuàng)建不同的子類,它們共享相同的基類接口,但可能有不同的實現方式。這樣,我們可以根據具體的對象類型來調用適當的方法,實現更靈活和可擴展的程序設計。
學習好了繼承,可以為后面的抽象和多態(tài)打好基礎,那么就由我?guī)ьI大家走進 python 繼承的世界吧。??????
繼承的概念
在生活中,繼承通常是指子女繼承父母的財產。但是在 python 中稍有區(qū)別,兩個具有一定關系的子類和父類,子類會繼承父類的所有除了私有的屬性和方法。我們可以訪問以及修改繼承來的屬性和方法。
在 python 中使用 class 子類名(父類名):
來表示繼承關系。
class Animal():
def __init__(self):
self.info = '動物'
def func(self):
print(f'屬于{self.info}')
class Cat(Animal):
pass # 這里pass是占位符,防止報錯
cat = Cat()
cat.func() # 屬于動物
繼承可以很大程度的提高代碼的復用率,提高代碼的簡潔性。
在python中,其實每一個類都默認繼承一個 object 基類
單繼承
一個類可以只繼承一個類,這種繼承關系叫做單繼承。
class Master():
def __init__(self):
self.wugong = '太極'
def func(self):
print(f'身懷絕技:{self.wugong}')
class Prentice(Master):
pass
zhangsan = Prentice()
zhangsan.func() # 身懷絕技:太極
多繼承
一個類也可以繼承多個父類,這種繼承關系叫做多繼承。
class Master2():
def __init__(self):
self.wugong = '閃電五連鞭'
def func(self):
print(f'身懷絕技:{self.wugong}')
class Prentice(Master1,Master2):
pass
zhangsan = Prentice()
zhangsan.func()
當我們一個繼承多個父類的時候,如果沒有特地指明,默認使用第一個繼承的父類的屬性和方法。
如果我們想要查看該類的繼承關系,我們可以使用 __mro__
來查看繼承關系。
print(Prentice.__mro__)
子類重寫父類的同名方法和屬性
子類繼承父類的屬性和方法,不可能原封不動的繼承,子類也可以具有自己的特性。那么這里就需要用到 重寫 的方法了。
class Master1():
def __init__(self):
self.wugong = '太極'
def func(self):
print(f'身懷絕技:{self.wugong}')
class Master2():
def __init__(self):
self.wugong = '閃電五連鞭'
def func(self):
print(f'身懷絕技:{self.wugong}')
class Prentice(Master1,Master2):
def __init__(self):
self.wugong = '太極+輕功'
def func(self):
print(f'身懷絕技:{self.wugong}')
zhangsan = Prentice()
zhangsan.func() # 身懷絕技:太極+輕功
子類調用父類同名的方法和屬性
當我們在子類中調用和父類具有相同名字的屬性和方法的時候,默認會調用子類具有的屬性和方法。
class Master1():
def __init__(self):
self.wugong = '太極'
def func(self):
print(f'身懷絕技:{self.wugong}')
class Master2():
def __init__(self):
self.wugong = '閃電五連鞭'
def func(self):
print(f'身懷絕技:{self.wugong}')
class Prentice(Master1,Master2):
def __init__(self):
self.wugong = '火星大力拳'
def func(self):
print(f'身懷絕技:{self.wugong}')
zhangsan = Prentice()
zhangsan.func() # 身懷絕技:火星大力拳
那么如果我們要在父類中調用具有同名的父類的屬性和方法該怎么做呢?
- 如果是先調用了父類的屬性和方法,父類的屬性和方法會覆蓋子類的屬性和方法,所以如果我們想要使用子類自己的屬性和方法,需要調用子類自己的初始化方法。
- 如果我們想要在子類中調用父類的屬性和方法,我們也需要先調用父類的初始化方法。
先調用父類的初始化方法,然后再使用 父類類名.方法(self)
來調用父類的方法。
class Master():
def __init__(self):
self.wugong = '太極'
def func(self):
print(f'身懷絕技:{self.wugong}')
class Prentice(Master):
def __init__(self):
self.wugong = '閃電五連鞭'
def func(self):
print(f'身懷絕技:{self.wugong}')
def func1(self):
Master.__init__(self) # 調用父類的初始化方法
Master.func(self)
def func2(self):
self.func()
zhangsan = Prentice()
zhangsan.func1()
zhangsan.func2()
當我們在子類中調用父類的初始化方法或者方法的時候,函數的參數列表必須加上 self ,否則就會報錯。
當我們在子類中先調用父類的屬性和方法的時候,再調用同名的子類自己的方法的時候,如果沒有先調用子類自己的初始化方法,我們會發(fā)現會使用父類的屬性和方法。
def func2(self):
self.__init__()
self.func()
zhangsan = Prentice()
zhangsan.func1()
zhangsan.func2()
我們還可以使用 super()
來調用父類的方法和屬性。但是這種 super() 只能調用子類的直接父類,不能調用簡介的父類,如果想要調用簡介父類,需要在直接父類的方法中使用 super()
super(當前類名,self).函數名
當然super里面的參數也可省略。
class Master():
def __init__(self):
self.wugong = '太極'
def func(self):
print(f'身懷絕技:{self.wugong}')
class Prentice(Master):
def __init__(self):
self.wugong = '閃電五連鞭'
def func(self):
print(f'身懷絕技:{self.wugong}')
def func1(self):
super().__init__()
super().func()
zhangsan = Prentice()
zhangsan.func1() # 身懷絕技:太極
使用 super() 后面的函數參數列表不需要條件self
多層繼承
多層繼承是指一個子類繼承自另一個子類,而該子類又繼承自另一個父類的情況。通過多層繼承,可以在類之間形成層次結構,使得子類可以繼承和重用祖先類的屬性和方法。
# 定義基類A
class A:
def method_A(self):
print("This is method A")
# 定義中間類B,繼承自基類A
class B(A):
def method_B(self):
print("This is method B")
# 定義子類C,繼承自中間類B
class C(B):
def method_C(self):
print("This is method C")
在上述代碼中,類A是基類,類B繼承自基類A,類C繼承自中間類B。這樣,類C就擁有了自己的方法method_C,以及繼承自類B和類A的方法method_B和method_A。
通過多層繼承,實例化類C的對象,我們既可以調用method_C方法,也可以調用從類B和類A繼承而來的方法:
obj = C()
obj.method_C() # 調用C類的方法
obj.method_B() # 調用B類的方法
obj.method_A() # 調用A類的方法
This is method C
This is method B
This is method A
需要注意的是,在進行多層繼承時,我們要謹慎選擇繼承關系,以避免出現復雜和難以維護的繼承鏈。合理設計繼承關系能夠提高代碼的可讀性和可維護性,同時也要注意避免過度依賴繼承,以免造成耦合性過高的問題。
私有權限
父類繼承給子類,可以選擇性的繼承,可以選擇有的東西不繼承,這些不繼承的事物可以被設置成私有權限,私有權限只能在當前類中訪問和修改,就算是該類的子類也不能使用。
在 python 中,如果我們想設置私有權限,可以使用連個下劃線來修飾方法名或者屬性__xx
class Master():
def __init__(self):
self.wugong = '太極'
self.__name = 'lisi'
def func(self):
print(f'身懷絕技:{self.wugong}')
class Prentice(Master):
def __init__(self):
self.wugong = '閃電五連鞭'
def func(self):
print(super().__name) 3 訪問父類的私有權限
zhangsan = Prentice()
zhangsan.func()
我們不能訪問和修改父類中的私有權限
但是呢,我們的父類可以提供接口來供子類或者其他類來獲取和修改私有權限。
我們通常使用 get_xx
來獲取私有權限值,set_xx
來修改私有權限值。文章來源:http://www.zghlxwxcb.cn/news/detail-553011.html
class Master():
def __init__(self):
self.wugong = '太極'
self.__name = 'lisi'
def func(self):
print(f'身懷絕技:{self.wugong}')
def get_name(self):
return self.__name
def set_name(self,name):
self.__name = name
master = Master()
print(master.get_name())
master.set_name('wangwu')
print(master.get_name())
文章來源地址http://www.zghlxwxcb.cn/news/detail-553011.html
到了這里,關于python 面向對象之繼承的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!