一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

腳本之家,腳本語(yǔ)言編程技術(shù)及教程分享平臺(tái)!
分類(lèi)導(dǎo)航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務(wù)器之家 - 腳本之家 - Python - Python面向?qū)ο笾^承代碼詳解

Python面向?qū)ο笾^承代碼詳解

2021-01-10 00:09世界看我我看世界 Python

這篇文章主要介紹了Python面向?qū)ο笾^承代碼詳解,分享了相關(guān)代碼示例,小編覺(jué)得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下

本文研究的主要是Python面向?qū)ο?/a>之繼承的相關(guān)內(nèi)容,具體如下。

Python 繼承

即一個(gè)派生類(lèi)(derived class)繼承基類(lèi)(bass class)字段和方法。繼承也允許把一個(gè)派生類(lèi)的對(duì)象作為一個(gè)基類(lèi)對(duì)象對(duì)待。例如,有這樣一個(gè)設(shè)計(jì),一個(gè)Cat類(lèi)型的對(duì)象派生自Animal類(lèi),這是模擬”是一個(gè)(is-a)”關(guān)系(例如,Cat是一個(gè)Animal)。

繼承實(shí)現(xiàn)了代碼的重用。

繼承的基本語(yǔ)法:

class 派生類(lèi)名(基類(lèi)名1 [, 基類(lèi)名2....]):

基類(lèi)名寫(xiě)在括號(hào)里,基本類(lèi)是在類(lèi)定義的時(shí)候,在元組之中指明的。如果在繼承元組中列了一個(gè)以上的類(lèi),那么它就被稱(chēng)作”多重繼承” 。

多重繼承

Python支持多重繼承,也就是一個(gè)子類(lèi)可以有多個(gè)父類(lèi),父類(lèi)間用逗號(hào)隔開(kāi)。

在多重繼承中,子類(lèi)有那么多的父類(lèi),那子類(lèi)實(shí)例化時(shí),構(gòu)造方法是怎樣調(diào)用的呢?

這里需要記住一點(diǎn):

多重繼承中,構(gòu)造方法以第一個(gè)父類(lèi)為中心。如果子類(lèi)重新定義了構(gòu)造方法,就不會(huì)調(diào)用父類(lèi)的構(gòu)造方法,構(gòu)造就會(huì)只調(diào)用第一個(gè)父類(lèi)的構(gòu)造方法,并且如果父類(lèi)中有同名的方法時(shí),通過(guò)子類(lèi)的實(shí)例對(duì)象去調(diào)用的該方法也是第一個(gè)父類(lèi)中的方法。當(dāng)然如果你需要在子類(lèi)中用來(lái)某個(gè)或某幾個(gè)父類(lèi)的構(gòu)造方法,需要顯示的去調(diào)用父類(lèi)的構(gòu)造方法。

在python中繼承中的一些特點(diǎn):

  1. 在繼承中基類(lèi)的構(gòu)造(__init__()方法)不會(huì)被自動(dòng)調(diào)用,它需要在其派生類(lèi)的構(gòu)造中親自專(zhuān)門(mén)調(diào)用。
  2. 在調(diào)用基類(lèi)的方法時(shí),需要加上基類(lèi)的類(lèi)名前綴,且需要帶上self參數(shù)變量。區(qū)別于在類(lèi)中調(diào)用普通函數(shù)時(shí)并不需要帶上self參數(shù)。
  3. Python總是首先查找對(duì)應(yīng)類(lèi)型的方法,如果它不能在派生類(lèi)中找到對(duì)應(yīng)的方法,它才開(kāi)始到基類(lèi)中逐個(gè)查找。(先在本類(lèi)中查找調(diào)用的方法,找不到才去基類(lèi)中找)。
  4. 子類(lèi)只繼承父類(lèi)所有公有的屬性和方法,并且也可以在子類(lèi)中通過(guò)父類(lèi)名來(lái)調(diào)用,而對(duì)于私有的屬性和方法,子類(lèi)是不進(jìn)行繼承的,因此在子類(lèi)中是無(wú)法通過(guò)父類(lèi)名來(lái)訪問(wèn)的。

實(shí)例:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
class Parent(object): # define parent class
 parentAttr = 100
 def __init__(self):
  print "Calling parent constructor"
 
 def parentMethod(self):
  print 'Calling parent method'
 
 def setAttr(self, attr):
  Parent.parentAttr = attr
 
 def getAttr(self):
  print "Parent attribute :", Parent.parentAttr
 
class Child1(Parent): # define child1 class
 def __init__(self):
  print "Calling child1 constructor"
 
 def childMethod(self):
  print 'Calling child1 method'
  Parent.parentMethod(self) #調(diào)用基類(lèi)的方法,所以要加上參數(shù)self
 
class Child2(Parent): # define child2 class
 def childMethod(self):
  print 'Calling child2 method'
  self.parentMethod() #子類(lèi)調(diào)用自己從父類(lèi)那繼承過(guò)來(lái)的父類(lèi)的方法
 
c1 = Child1() # 實(shí)例化子類(lèi) 1
c2 = Child2() # 實(shí)例化子類(lèi) 2
c1.childMethod() # 調(diào)用子類(lèi)的方法
c2.childMethod() # 調(diào)用子類(lèi)的方法
c1.parentMethod() # 調(diào)用父類(lèi)方法
c1.setAttr(200) # 再次調(diào)用父類(lèi)的方法
c1.getAttr() # 再次調(diào)用父類(lèi)的方法

執(zhí)行結(jié)果:

Calling child1 constructor
Calling parent constructor
Calling child1 method
Calling parent method
Calling child2 method
Calling parent method
Calling parent method
Parent attribute : 200

解析:

?
1
2
c1 = Child1() # 實(shí)例化子類(lèi) 1
c2 = Child2() # 實(shí)例化子類(lèi) 2

這兩句是創(chuàng)建Child1類(lèi)和Child2類(lèi)的實(shí)例對(duì)象,創(chuàng)建實(shí)例對(duì)象時(shí),就會(huì)自動(dòng)去調(diào)類(lèi)的構(gòu)造方法,如果子類(lèi)中沒(méi)有建立自己的構(gòu)造方法,就會(huì)調(diào)用父類(lèi)的構(gòu)造方法,所以打印結(jié)果為:

Calling child1 constructor
Calling parent constructor

c1.childMethod() # 調(diào)用子類(lèi)的方法
c2.childMethod() # 調(diào)用子類(lèi)的方法

上面兩句分別調(diào)用的是對(duì)應(yīng)子類(lèi)的子類(lèi)方法,由于在子類(lèi)中都分別有調(diào)用父類(lèi)的方法,所以打印結(jié)果為:

Calling child1 method
Calling parent method
Calling child2 method
Calling parent method

 

注意:

子類(lèi)繼承父類(lèi)以后,如果在子類(lèi)在對(duì)父類(lèi)的方法進(jìn)行改造時(shí),由需要用到父類(lèi)的方法時(shí),這個(gè)時(shí)候在子類(lèi)中想要調(diào)用父類(lèi)的方法時(shí),該怎么做呢?有兩種方法:

  1. Parent.parentMethod(self)
  2. self.parentMethod()

第一種是直接用父類(lèi)的類(lèi)名.方法名去調(diào)用父類(lèi)的方法,但是需要注意的時(shí),這種調(diào)用方法必須將self作為參數(shù)傳進(jìn)去并且作為第一個(gè)參數(shù),表示指向指向這個(gè)類(lèi)的實(shí)例本身。

第二種是直接用self去調(diào)用父類(lèi)的方法,為什么可以這樣調(diào)用呢?因?yàn)橐坏┳宇?lèi)繼承了父類(lèi),那么子類(lèi)就擁有父類(lèi)所有的方法和屬性,所以此時(shí)父類(lèi)的方法和屬性就相當(dāng)于子類(lèi)自己了,所以可以直接用self去直接調(diào)用實(shí)例的方法,而不用再傳入self參數(shù)了。

使用issubclass()或者isinstance()方法來(lái)檢測(cè)類(lèi)之間的關(guān)系:

  1. issubclass() - 布爾函數(shù)判斷一個(gè)類(lèi)是另一個(gè)類(lèi)的子類(lèi)或者子孫類(lèi), 語(yǔ)法:issubclass(sub,sup)
  2. isinstance(obj, Class) 布爾函數(shù)如果obj是Class類(lèi)的實(shí)例對(duì)象或者是一個(gè)Class子類(lèi)的實(shí)例對(duì)象則返回true。

總結(jié)

以上就是本文關(guān)于Python面向?qū)ο笾^承代碼詳解的全部?jī)?nèi)容,希望對(duì)大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站其他相關(guān)專(zhuān)題,如有不足之處,歡迎留言指出。感謝朋友們對(duì)本站的支持!

原文鏈接:http://blog.csdn.net/seetheworld518/article/details/48810183

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 5x视频在线观看 | 免费观看在线aa | 日本高清va不卡视频在线观看 | 小早川怜子亚洲综合中文字幕 | 大团圆6全文在线阅读 | 日韩久久综合 | tobu8中国在线播放免费 | 久久亚洲精品中文字幕60分钟 | 咪咪爱在线视频 | 日韩国产成人精品视频 | 欧美一级一级做性视频 | 91精品国产91热久久久久福利 | 秋葵丝瓜茄子草莓榴莲樱桃 | 成人18在线观看 | 亚洲欧美日韩天堂 | 国产网站视频 | 日日操美女 | 亚洲精品欧洲久久婷婷99 | 超h 超重口 高h 污肉1v1 | 日本aaaaa高清免费看 | 下雨天小说词枝 | 99热r| 亚洲四虎影院 | 久久久无码精品亚洲A片软件 | 色啪久久婷婷综合激情 | 国产福利资源网在线观看 | 美女的让男人桶爽免费看 | 亚洲欧美日韩综合一区久久 | 四虎影院大全 | 4444亚洲国产成人精品 | 日韩精品视频福利资源站 | 操小女人 | 日本成年片高清在线观看 | 日本激情网 | 日韩视频免费一区二区三区 | 91制片厂制作传媒破解版免费 | 天堂网在线.www天堂在线资源 | 日本捏胸吃奶视频免费 | 911精品国产亚洲日本美国韩国 | 亚洲国产在线2o20 | 精品久久久久香蕉网 |