淺談Python中的繼承
繼承
Python 中所有的類都是object類的子類,而object 繼承自type
繼承分為 接口繼承和實現(xiàn)繼承
接口繼承:使用父類的接口名,子類重寫這個方法。盡可能的繼承接口類,在子類中實現(xiàn)方法,鼓勵對接口類的多繼承,這樣遵循接口隔離原則,有利于歸一化設計,不提倡對抽象類進行多繼承
實現(xiàn)繼承:子類不需要實現(xiàn)任何東西,直接使用父類接口和實現(xiàn)會增強代碼的耦合性,不推薦使用。
一些細節(jié)
類繼承最終要被實例化,我們多數(shù)時候使用的還是對象而不是類。因此我們還是來一點點看繼~
繼承的過程
承僅僅是一種代碼復用的手段,并不會講代碼全部的加載到子類的空間中,方法依然屬于父類。下面的例子能看到,Cat.func 依然是 Animal 的,更近一步的理解,func 也僅僅是func,它只是被綁定到了類 Animal上而已,類 只是能幫我們找到這個函數(shù),子類通過父類找到這個函數(shù)就完了~ 。
class Animal(object):
def func(self):
print("Animal.func")
class Dog(Animal):
def func(self):
print('Dog.func')
class Cat(Animal):
""" No func~ """
print(Animal.func) # <function Animal.func at 0x103f79620>
print(Cat.func) # <function Animal.func at 0x103f79620>
print(Dog.func) # <function Dog.func at 0x104073510>
實例化的過程
實例化過程中屬性和方法并不會出現(xiàn)在實例的空間里。它們依然屬于類本身,對象也只是能找到他們,然后調用他們。但是當修改對象的屬性時,會在對象的空間中創(chuàng)建同名的屬性。這是屬于對象的屬性。復雜的繼承其本質也是一樣的。
class Animal(object):
def tell(self):
print('self.name:%s Animal.name %s ' % (id(self.name), id(Animal.name)))
name = 'Animal'
class Cat(Animal):
""" No func~ """
def tell(self):
super().tell()
print('self.name %s Cat.name %s '% (id(self.name), id(Cat.name)))
cat = Cat()
cat.tell()
cat.name = 'django'
cat.tell()
# self.name:4473398472 Animal.name 4473398472
# self.name 4473398472 Cat.name 4473398472
# self.name:4474859736 Animal.name 4473398472
# self.name 4474859736 Cat.name 4473398472
單繼承
越靠近本類的方法會覆蓋祖輩的方法,這叫方法的覆蓋或重寫 原理是 Python的屬性檢索機制 從內層命名空間往外查詢
class MyClass(object):
"""
A simple example class
"""
MyClassName = 'MyClass'
name = 'MyClass'
def func(self):
print("This is {}".format(self.__class__.name))
def get_name(self):
print(self.name)
class MySonClass(MyClass):
MySonClass = 'MySonClass'
name = 'MySonClass' # 屬性的重寫
def get_name(self):
super().get_name()
print('我重寫了父類的get_name方法,上面是父類的方法,我來自子類!')
person1 = MyClass()
person2 = MySonClass()
person1.func()
person2.func() # 方法的實現(xiàn)繼承 自己沒有,會直接調用父類的方法。但是使用的屬性還是自己的。
print('*'*40)
person1.get_name()
person2.get_name() # 方法的接口繼承,在子類中重寫了這個方法。
# 結果
#------------------------------
# This is MyClass
# This is MySonClass
# ****************************************
# MyClass
# MySonClass
# 我重寫了父類的get_name方法,上面是父類的方法,我來自子類!
多繼承
就形式上來說,類的繼承列表可以是一個,也可以是多個,當繼承列表只有一個類時,也就是只有一個父類時,稱為單繼承,大于一個類,就稱為多繼承。
新式類的繼承方式為 廣度優(yōu)先繼承 經(jīng)典類的繼承方式為 深度優(yōu)先繼承。
類繼承的順序可以使用類的 __mro__ 方法查看。
鉆石繼承
class A(object): m = 'a' class B(A): m = 'b' class C(A): m = 'c' class D(B,C): # m = 'd' pass x = D() print(x.m) # D 的實例化對象如果獲取 m 屬性會優(yōu)先的尋找自己的命名空間,查找順序為 D -> B -> C -> A
super()方法
語法super(類,實例化對象).父類的方法
當super()方法在類的內部使用時候,甚至不需要任何的參數(shù)
當在多繼承中使用super()方法的時候執(zhí)行的不再是父類的方法了 而是和mro中上一級的方法
super()為了解決多繼承中,初始化方法被重復調用的問題。(當使用類名.方法名的時候)
當使用super()方法執(zhí)行“父類” (__mro__ 方法的上一個類) 的方法
# 鉆石繼承中的 重復調用問題
# 注意 繼承的查找順序~ 使用super()將按照 mro 順序執(zhí)行
class Grand(object):
def __init__(self, name):
self.name = name
print("class Grand ")
class SonLeft(Grand):
def __init__(self, age, name):
self.age = age
Grand.__init__(self, name) # 注釋調 跑一跑 看一看
# super().__init__(age, name)
print("class SonLeft")
class SonRight(Grand):
def __init__(self, gender, name):
self.gender = gender
Grand.__init__(self, name) # 注釋調 跑一跑 看一看
# super().__init__(name)
print("class SonRight")
class GrandSon(SonLeft, SonRight):
def __init__(self, name, age, gender):
# super().__init__(age, name)
SonLeft.__init__(self, age, name) # 注釋調 跑一跑 看一看
SonRight.__init__(self, gender, name) # 注釋調 跑一跑 看一看
self.gender = gender
grand_son = GrandSon("Monkey", 18, "男")
以上就是淺談Python中的繼承的詳細內容,更多關于Python 繼承的資料請關注腳本之家其它相關文章!
相關文章
python GUI庫圖形界面開發(fā)之PyQt5輸入對話框QInputDialog詳細使用方法與實例
這篇文章主要介紹了python GUI庫圖形界面開發(fā)之PyQt5輸入對話框QInputDialog詳細使用方法與實例,需要的朋友可以參考下2020-02-02
Django values()和value_list()的使用
這篇文章主要介紹了Django values()和value_list()的使用,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-03-03
使用Python下的XSLT API進行web開發(fā)的簡單教程
這篇文章主要介紹了使用Python下的XSLT API進行web開發(fā)的簡單教程,本文來自于IBM官方網(wǎng)站技術文檔,需要的朋友可以參考下2015-04-04
Python開發(fā)時報TypeError:?‘int‘?object?is?not?iterable錯誤的解決方
Python寫循環(huán)程序的時候遇到TypeError:'int'object is not iterable,所以下面這篇文章主要給大家介紹了關于Python開發(fā)時報TypeError:'int'?object?is?not?iterable錯誤的解決方式,需要的朋友可以參考下2022-06-06

