欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

跟老齊學(xué)Python之編寫(xiě)類(lèi)之三子類(lèi)

 更新時(shí)間:2014年10月11日 10:26:58   投稿:hebedich  
本文已經(jīng)是編寫(xiě)類(lèi)系列的第三篇了,也是最后一篇,介紹下子類(lèi),也算是個(gè)小總結(jié)吧,有需要的朋友可以參考下

關(guān)于類(lèi),看官想必已經(jīng)有了感覺(jué),看下面的代碼,請(qǐng)仔細(xì)閱讀,并看看是否能夠發(fā)現(xiàn)點(diǎn)什么問(wè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)行起來(lái)沒(méi)有什么問(wèn)題,但是,仔細(xì)看,發(fā)現(xiàn)有兩個(gè)類(lèi),一個(gè)名字叫做Person,另外一個(gè)叫做Programmer,這還不是問(wèn)題所在,問(wèn)題所在是這兩個(gè)類(lèi)的構(gòu)造函數(shù)中,存在這相同的地方:self.name=name,self.lang=lang,self.email=email,這對(duì)于追求代碼質(zhì)量的程序員,一般是不允許的。最好不要有重復(fù)代碼或者冗余代碼。可是,在兩個(gè)類(lèi)中都要有這些參數(shù),應(yīng)該怎么辦呢?

子類(lèi)、父類(lèi)和繼承

看下面的代碼,里面有兩個(gè)類(lèi)A,B。這段程序能夠正確運(yùn)行,每個(gè)類(lèi)的功能是僅僅打印指定的內(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è)類(lèi)彼此之間沒(méi)有所謂的父子關(guān)系?,F(xiàn)在稍加改變,將類(lèi)B改寫(xiě),注意觀察與上面的差異。

復(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

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

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

復(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)行繼承的父類(lèi)

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

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

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

下面把最開(kāi)頭的那端程序用子類(lèi)繼承的方式重寫(xiě),可以是這樣的:

復(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):       #繼承父類(lèi)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                       #通過(guò)繼承已經(jīng)實(shí)現(xiàn)了這三句的功能
        #self.email = email
        self.system = system                    #子類(lèi)中不同于Person父類(lèi)部分
        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é)果與前面一樣。

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

對(duì)于為什么要用繼承,好友@令狐蟲(chóng) 大俠給了以非常精彩的解釋?zhuān)?/p>

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

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

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

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

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

相關(guān)文章

  • Django模型修改及數(shù)據(jù)遷移實(shí)現(xiàn)解析

    Django模型修改及數(shù)據(jù)遷移實(shí)現(xiàn)解析

    這篇文章主要介紹了Django模型修改及數(shù)據(jù)遷移實(shí)現(xiàn)解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-08-08
  • Python處理Excel文件實(shí)例代碼

    Python處理Excel文件實(shí)例代碼

    本篇文章主要介紹了Python處理Excel文件實(shí)例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-06-06
  • python神經(jīng)網(wǎng)絡(luò)TensorFlow簡(jiǎn)介常用基本操作教程

    python神經(jīng)網(wǎng)絡(luò)TensorFlow簡(jiǎn)介常用基本操作教程

    這篇文章主要介紹了python神經(jīng)網(wǎng)絡(luò)入門(mén)TensorFlow簡(jiǎn)介常用基本操作教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2021-11-11
  • PyTorch?TensorFlow機(jī)器學(xué)習(xí)框架選擇實(shí)戰(zhàn)

    PyTorch?TensorFlow機(jī)器學(xué)習(xí)框架選擇實(shí)戰(zhàn)

    這篇文章主要為大家介紹了PyTorch?TensorFlow機(jī)器學(xué)習(xí)框架選擇實(shí)戰(zhàn),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10
  • pycharm使用docker容器開(kāi)發(fā)的詳細(xì)教程

    pycharm使用docker容器開(kāi)發(fā)的詳細(xì)教程

    這篇文章主要介紹了pycharm使用docker容器開(kāi)發(fā)的詳細(xì)教程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-01-01
  • 基于YUV 數(shù)據(jù)格式詳解及python實(shí)現(xiàn)方式

    基于YUV 數(shù)據(jù)格式詳解及python實(shí)現(xiàn)方式

    今天小編就為大家分享一篇基于YUV 數(shù)據(jù)格式詳解及python實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-12-12
  • pytorch之ImageFolder使用詳解

    pytorch之ImageFolder使用詳解

    今天小編就為大家分享一篇pytorch之ImageFolder使用詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-01-01
  • Pandas讀寫(xiě)CSV文件的方法示例

    Pandas讀寫(xiě)CSV文件的方法示例

    這篇文章主要介紹了Pandas讀寫(xiě)CSV文件的方法示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • python opencv旋轉(zhuǎn)圖像(保持圖像不被裁減)

    python opencv旋轉(zhuǎn)圖像(保持圖像不被裁減)

    這篇文章主要為大家詳細(xì)介紹了python opencv旋轉(zhuǎn)圖像,保持圖像不被裁減,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-07-07
  • 使用python實(shí)現(xiàn)UDP通信方式

    使用python實(shí)現(xiàn)UDP通信方式

    這篇文章主要介紹了使用python實(shí)現(xiàn)UDP通信方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-05-05

最新評(píng)論