欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

跟老齊學(xué)Python之編寫類之三子類

系統(tǒng) 1632 0

關(guān)于類,看官想必已經(jīng)有了感覺,看下面的代碼,請仔細(xì)閱讀,并看看是否能夠發(fā)現(xiàn)點(diǎn)什么問題呢?

復(fù)制代碼 代碼如下:

#!/usr/bin/env python
#coding:utf-8

class Person:
??? def __init__(self, name, lang, email):
??????? self.name = name
??????? self.lang = lang
??????? self.email = email

??? def author(self):
??????? return self.name

class Programmer:
??? def __init__(self, name, lang, email, system, website):
??????? self.name = name
??????? self.lang = lang
??????? self.email = email
??????? self.system = system
??????? self.website = website

??? def pythoner(self):
??????? pythoner_list = [ self.name, self.lang, self.email, self.system, self.website ]
??????? return pythoner_list

if __name__=="__main__":
??? writer = Person("qiwsir","Chinese","qiwsir@gmail.com")
??? python = Programmer("qiwsir","Python","qiwsir@gmail.com","Ubutun","qiwsir.github.io")
??? print "My name is:%s"%writer.author()
??? print "I write program by:%s"%python.pythoner()[1]

?上面這段代碼,運(yùn)行起來沒有什么問題,但是,仔細(xì)看,發(fā)現(xiàn)有兩個(gè)類,一個(gè)名字叫做Person,另外一個(gè)叫做Programmer,這還不是問題所在,問題所在是這兩個(gè)類的構(gòu)造函數(shù)中,存在這相同的地方:self.name=name,self.lang=lang,self.email=email,這對于追求代碼質(zhì)量的程序員,一般是不允許的。最好不要有重復(fù)代碼或者冗余代碼。可是,在兩個(gè)類中都要有這些參數(shù),應(yīng)該怎么辦呢?

子類、父類和繼承

看下面的代碼,里面有兩個(gè)類A,B。這段程序能夠正確運(yùn)行,每個(gè)類的功能是僅僅打印指定的內(nèi)容。

復(fù)制代碼 代碼如下:

#!/usr/bin/env python
#coding:utf-8

class A:
??? def __init__(self):
??????? print "aaa"

class B:
??? def __init__(self):
??????? print "bbb"

if __name__=="__main__":
??? a = A()
??? b = B()

#運(yùn)行結(jié)果
aaa
bbb

?上面的兩個(gè)類彼此之間沒有所謂的父子關(guān)系。現(xiàn)在稍加改變,將類B改寫,注意觀察與上面的差異。

復(fù)制代碼 代碼如下:
#!/usr/bin/env python
#coding:utf-8

class A:
??? def __init__(self):
??????? print "aaa"

class B(A):???????? #這里和上面程序不同。B繼承了A
??? def __init__(self):
??????? print "bbb"

if __name__=="__main__":
??? a = A()
??? b = B()

#運(yùn)行結(jié)果
aaa
bbb

?這段程序中,類B跟前面的那段有一點(diǎn)不同,class B(A):,這樣寫就表明了B相對A的關(guān)系:B是A的子類,B從A繼承A的所有東西(子承父業(yè))。

但是,看官發(fā)現(xiàn)了沒有,運(yùn)行結(jié)果一樣。是的,那是以為在B中盡管繼承了A,但是沒有調(diào)用任何A的東西,就好比兒子從老爸那里繼承了財(cái)富,但是兒子一個(gè)子也沒動,外界看到的和沒有繼承一樣。

復(fù)制代碼 代碼如下:

#!/usr/bin/env python
#coding:utf-8

class A:
??? def __init__(self):
??????? print "aaa"

class B(A):
??? def __init__(self):
??????? #print "bbb"
??????? A.__init__(self)??? #運(yùn)行繼承的父類

if __name__=="__main__":
??? a = A()
??? b = B()

#運(yùn)行結(jié)果
aaa
aaa

?這回運(yùn)行結(jié)果有了變化,本來b=B()是運(yùn)行類B,但是B繼承了A,并且在初始化的構(gòu)造函數(shù)中,引入A的構(gòu)造函數(shù),所以,就運(yùn)行A的結(jié)果相應(yīng)結(jié)果了。

下面把最開頭的那端程序用子類繼承的方式重寫,可以是這樣的:

復(fù)制代碼 代碼如下:

#!/usr/bin/env python
#coding:utf-8

class Person:
??? def __init__(self, name, lang, email):
??????? self.name = name
??????? self.lang = lang
??????? self.email = email

??? def author(self):
??????? return self.name
"""
class Programmer:
??? def __init__(self, name, lang, email, system, website):
??????? self.name = name
??????? self.lang = lang
??????? self.email = email
??????? self.system = system
??????? self.website = website

??? def pythoner(self):
??????? pythoner_list = [ self.name, self.lang, self.email, self.system, self.website ]
??????? return pythoner_list
"""

class Programmer(Person):?????? #繼承父類Person
??? def __init__(self, name, lang, email, system, website):
??????? Person.__init__(self,name,lang,email)?? #將Person.__init__()的功能繼承到這里
??????? #self.name = name?????????????????????? #這三句是Person中已經(jīng)搞定的,就不用重復(fù)
??????? #self.lang = lang?????????????????????? #通過繼承已經(jīng)實(shí)現(xiàn)了這三句的功能
??????? #self.email = email
??????? self.system = system??????????????????? #子類中不同于Person父類部分
??????? self.website = website

??? def pythoner(self):
??????? pythoner_list = [ self.name, self.lang, self.email, self.system, self.website ]
??????? return pythoner_list

if __name__=="__main__":
??? writer = Person("qiwsir","Chinese","qiwsir@gmail.com")
??? python = Programmer("qiwsir","Python","qiwsir@gmail.com","Ubutun","qiwsir.github.io")
??? print "My name is:%s"%writer.author()
??? print "I write program by:%s"%python.pythoner()[1]

?代碼運(yùn)行結(jié)果與前面一樣。

列位是否理解了子類和父類、繼承的特點(diǎn)。如果你有一個(gè)老爹,是一個(gè)高官或者富豪,那么你就官二代或者富二代了,你就從他們那里繼承了很多財(cái)富,所以生活就不用太勞累了。這就是繼承的作用。在代碼中,也類似,繼承能夠讓寫代碼的少勞累一些。

對于為什么要用繼承,好友@令狐蟲 大俠給了以非常精彩的解釋:

復(fù)制代碼 代碼如下:

從技術(shù)上說,OOP里,繼承最主要的用途是實(shí)現(xiàn)多 態(tài)。對于多態(tài)而言,重要的是接口繼承性,屬性和行為是否存在繼承性,這是不一定的。事實(shí)上,大量工程實(shí)踐表明,重度的行為繼承會導(dǎo)致系統(tǒng)過度復(fù)雜和臃腫, 反而會降低靈活性。因此現(xiàn)在比較提倡的是基于接口的輕度繼承理念。這種模型里因?yàn)楦割悾ń涌陬悾┩耆珱]有代碼,因此根本談不上什么代碼復(fù)用了。

在Python里,因?yàn)榇嬖贒uck Type,接口定義的重要性大大的降低,繼承的作用也進(jìn)一步的被削弱了。

另外,從邏輯上說,繼承的目的也不是為了復(fù)用代碼,而是為了理順關(guān)系。

?
我表示完全贊同上述解釋。不過看官如果不理解,也沒有關(guān)系,上述解釋中的精神,的確需要在編程實(shí)踐中感悟才能領(lǐng)會到的。


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 欧美毛片aaa激情 | 久久精品免费视频观看 | 天天草夜夜骑 | 999热视频 | 女人被添全过程A片久久AV | 亚洲资源在线视频 | 免费在线看a | 日本不卡一区二区 | 久久中文字幕一区二区三区 | 亚洲国产精品视频一区 | 国产成人精品.一二区 | 免费一级毛片 | 亚洲高清中文字幕一区二区三区 | free-porn-ok.com| 亚洲另类自拍 | 精品免费在线 | 奇米影视777中文久久爱 | 亚洲精品成A人在线观看拍拍拍 | 182tv成人网182tv香蕉 | 国产成人精品日本亚洲麻豆 | 天天躁日日躁很很躁2022 | 夜色亚洲 | 国产成人综合在线 | 国产四区| 日本资源站 | 手机日韩看片 | 毛片一区二区三区四区 | 天天高清 | 欧美性综合 | 91观看| 男人的天堂在线视频 | 91免费在线看 | 亚洲婷婷国产精品电影人久久 | 日本在线你懂的 | 日本一区二区三区四区高清视频 | 青青青青手机在线视频观看国产 | 亚洲www.| 精品在线一区二区三区 | 国产精品高清在线观看 | 中文字幕日韩欧美一区二区三区 | 亚洲热综合 |