亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

淺談Python中的繼承

瀏覽:3日期:2022-07-20 11:43:10

繼承

Python 中所有的類都是object類的子類,而object 繼承自type

繼承分為 接口繼承和實(shí)現(xiàn)繼承

接口繼承:使用父類的接口名,子類重寫這個(gè)方法。盡可能的繼承接口類,在子類中實(shí)現(xiàn)方法,鼓勵(lì)對(duì)接口類的多繼承,這樣遵循接口隔離原則,有利于歸一化設(shè)計(jì),不提倡對(duì)抽象類進(jìn)行多繼承

實(shí)現(xiàn)繼承:子類不需要實(shí)現(xiàn)任何東西,直接使用父類接口和實(shí)現(xiàn)會(huì)增強(qiáng)代碼的耦合性,不推薦使用。

一些細(xì)節(jié)

類繼承最終要被實(shí)例化,我們多數(shù)時(shí)候使用的還是對(duì)象而不是類。因此我們還是來(lái)一點(diǎn)點(diǎn)看繼~

繼承的過(guò)程

承僅僅是一種代碼復(fù)用的手段,并不會(huì)講代碼全部的加載到子類的空間中,方法依然屬于父類。下面的例子能看到,Cat.func 依然是 Animal 的,更近一步的理解,func 也僅僅是func,它只是被綁定到了類 Animal上而已,類 只是能幫我們找到這個(gè)函數(shù),子類通過(guò)父類找到這個(gè)函數(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>

實(shí)例化的過(guò)程

實(shí)例化過(guò)程中屬性和方法并不會(huì)出現(xiàn)在實(shí)例的空間里。它們依然屬于類本身,對(duì)象也只是能找到他們,然后調(diào)用他們。但是當(dāng)修改對(duì)象的屬性時(shí),會(huì)在對(duì)象的空間中創(chuàng)建同名的屬性。這是屬于對(duì)象的屬性。復(fù)雜的繼承其本質(zhì)也是一樣的。

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

單繼承

越靠近本類的方法會(huì)覆蓋祖輩的方法,這叫方法的覆蓋或重寫 原理是 Python的屬性檢索機(jī)制 從內(nèi)層命名空間往外查詢

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方法,上面是父類的方法,我來(lái)自子類!’)person1 = MyClass()person2 = MySonClass()person1.func()person2.func() # 方法的實(shí)現(xiàn)繼承 自己沒(méi)有,會(huì)直接調(diào)用父類的方法。但是使用的屬性還是自己的。print(’*’*40)person1.get_name()person2.get_name() # 方法的接口繼承,在子類中重寫了這個(gè)方法。# 結(jié)果#------------------------------ # This is MyClass# This is MySonClass# ****************************************# MyClass# MySonClass# 我重寫了父類的get_name方法,上面是父類的方法,我來(lái)自子類!

多繼承

就形式上來(lái)說(shuō),類的繼承列表可以是一個(gè),也可以是多個(gè),當(dāng)繼承列表只有一個(gè)類時(shí),也就是只有一個(gè)父類時(shí),稱為單繼承,大于一個(gè)類,就稱為多繼承。

新式類的繼承方式為 廣度優(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’ passx = D()print(x.m)# D 的實(shí)例化對(duì)象如果獲取 m 屬性會(huì)優(yōu)先的尋找自己的命名空間,查找順序?yàn)?D -> B -> C -> A

super()方法

語(yǔ)法super(類,實(shí)例化對(duì)象).父類的方法

當(dāng)super()方法在類的內(nèi)部使用時(shí)候,甚至不需要任何的參數(shù)

當(dāng)在多繼承中使用super()方法的時(shí)候執(zhí)行的不再是父類的方法了 而是和mro中上一級(jí)的方法

super()為了解決多繼承中,初始化方法被重復(fù)調(diào)用的問(wèn)題。(當(dāng)使用類名.方法名的時(shí)候)

當(dāng)使用super()方法執(zhí)行“父類” (__mro__ 方法的上一個(gè)類) 的方法

# 鉆石繼承中的 重復(fù)調(diào)用問(wèn)題# 注意 繼承的查找順序~ 使用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) # 注釋調(diào) 跑一跑 看一看 # super().__init__(age, name) print('class SonLeft')class SonRight(Grand): def __init__(self, gender, name): self.gender = gender Grand.__init__(self, name) # 注釋調(diào) 跑一跑 看一看 # 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) # 注釋調(diào) 跑一跑 看一看 SonRight.__init__(self, gender, name) # 注釋調(diào) 跑一跑 看一看 self.gender = gendergrand_son = GrandSon('Monkey', 18, '男')

以上就是淺談Python中的繼承的詳細(xì)內(nèi)容,更多關(guān)于Python 繼承的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Python 編程
相關(guān)文章:
主站蜘蛛池模板: 国产欧美精品一区二区 | 日韩成人黄色 | 国产亚洲欧美另类第一页 | 亚洲色图在线视频 | 91视频首页 | 农村妇女色又黄一级毛片不卡 | 特黄黄三级视频在线观看 | 亚洲一区二区中文 | a级影院| 美女三级黄 | 国产在线观看高清精品 | 无内丝袜透明在线播放 | 久久这里只有精品国产 | 日本二级黄色片 | 久久精品全国免费观看国产 | 在线久综合色手机在线播放 | 麻豆视频在线观看免费 | 色婷婷综合激情 | 亚洲精品入口一区二区在线观看 | a及毛片 | 日本不卡视频一区二区三区 | 亚洲国产成人精品激情 | 免费国产视频 | 7799国产精品久久久久99 | 亚洲天天网综合自拍图片专区 | 国产资源在线观看 | 亚洲日本高清成人aⅴ片 | 黄色毛片视频校园交易 | 亚洲网站免费 | 欧美三级成人 | 久久精品国产99久久72 | 国产成人禁片免费观看 | 风流慈禧一级毛片在线播放 | aaa在线| 国产玖玖视频 | 国产人妖一区二区 | 黄片毛片在线观看 | 一级a做爰片欧欧美毛片4 | 成人性生活免费视频 | 婷婷综合在线观看丁香 | 国产精品最新 |